- 所有父级接口:
AutoCloseable,ResultSet,RowSet,Wrapper
请注意,冲突是 RowSet 对象的原始值与数据源中的值不匹配的情况,这表明自上次同步以来数据源行已被修改。还要注意 RowSet 对象的原始值是它在上次同步之前的值,不一定是它的初始值。
SyncResolver 对象的描述
SyncResolver 对象是实现 SyncResolver 接口的专用 RowSet 对象。它可能作为连接的 RowSet 对象(JdbcRowSet 接口的实现)或连接的 RowSet 对象(CachedRowSet 接口或其子接口之一的实现)运行。有关子接口的信息,请参阅 javax.sql.rowset 包说明。 SyncResolver 的参考实现实现了 CachedRowSet 接口,但其他实现可能会选择实现 JdbcRowSet 接口以满足特定需求。
在应用程序尝试将 RowSet 对象与数据源同步(通过调用 CachedRowSet 方法 acceptChanges )并发现一个或多个冲突后,行集的 SyncProvider 对象创建 SyncResolver 的实例。这个新的 SyncResolver 对象与尝试同步的 RowSet 对象具有相同的行数和列数。 SyncResolver 对象包含导致冲突的数据源中的值和所有其他值的 null。此外,它还包含有关每个冲突的信息。
获取和使用 SyncResolver 对象
当方法 acceptChanges 遇到冲突时,SyncProvider 对象创建一个 SyncProviderException 对象并将其设置为新的 SyncResolver 对象。 acceptChanges 方法将抛出此异常,然后应用程序可以捕获该异常并使用它来检索它包含的 SyncResolver 对象。以下代码片段使用SyncProviderException方法getSyncResolver获取SyncResolver对象解析器
catch (SyncProviderException spe) {
SyncResolver resolver = spe.getSyncResolver();
...
}
}
和解析器在手,应用程序可以使用它来获取它包含的有关冲突或冲突的信息。一个 SyncResolver 对象,例如解析器跟踪存在冲突的每一行的冲突。它还将锁定受行集命令影响的一个或多个表,以便在解决当前冲突时不会再发生冲突。
可以从 SyncResolver 对象中获取以下类型的信息:
发生冲突时正在尝试执行什么操作
SyncProvider 接口定义了四个常量来描述可能发生的状态。三个常量描述了 RowSet 对象在发现冲突时尝试执行的操作类型(更新、删除或插入),第四个常量表示没有冲突。这些常量是 SyncResolver 对象调用方法 getStatus 时可能的返回值。
int operation = resolver.getStatus();
数据源中引起冲突的值
当RowSet 对象已更改并尝试写入数据源的值自上次同步以来在数据源中也已更改时,存在冲突。应用程序可以调用 SyncResolver 方法 getConflictValue 来检索数据源中导致冲突的值,因为 SyncResolver 对象中的值是来自数据源的冲突值。
java.lang.Object conflictValue = resolver.getConflictValue(2);请注意,列中解析器可以由列号指定,就像在前面的代码行中所做的那样,或者由列名指定。
使用从方法 getStatus 和 getConflictValue 检索到的信息,应用程序可以确定应将哪个值保留在数据源中。然后,应用程序调用 SyncResolver 方法 setResolvedValue ,该方法将值设置为保留在 RowSet 对象和数据源中。
resolver.setResolvedValue("DEPT", 8390426);
在前面的代码行中,列名指定 RowSet 对象中要设置给定值的列。列号也可以用来指定列。
应用程序在解决了当前冲突行中的所有冲突后调用方法 setResolvedValue,并对 SyncResolver 对象中的每个冲突行重复此过程。
导航 SyncResolver 对象
因为 SyncResolver 对象是 RowSet 对象,所以应用程序可以使用所有 RowSet 方法来移动光标以导航 SyncResolver 对象。例如,应用程序可以使用 RowSet 方法 next 获取每一行,然后调用 SyncResolver 方法 getStatus 查看该行是否包含冲突。在有一个或多个冲突的行中,应用程序可以遍历列以查找任何非空值,这些值将是来自数据源的冲突值。
为了更轻松地导航 SyncResolver 对象,尤其是当存在大量没有冲突的行时,SyncResolver 接口定义了方法 nextConflict 和 previousConflict ,它们仅移动到包含至少一个冲突值的行。然后应用程序可以调用 SyncResolver 方法 getConflictValue ,为其提供列号,以获取冲突值本身。下一节中的代码片段给出了一个例子。
代码示例
以下代码片段演示了断开连接的RowSet 对象crs可能会尝试将自身与底层数据源同步,然后解决冲突。在 try 块中,crs调用方法 acceptChanges ,将 Connection 对象传递给它骗子.如果没有冲突,修改crs只是写入数据源。但是,如果有冲突,acceptChanges方法抛出一个SyncProviderException对象,catch块生效。在此示例中,说明了可以使用 SyncResolver 对象的多种方式之一,SyncResolver 方法 nextConflict 在 while 循环中使用。当 nextConflict 返回 false 时循环将结束,这将在 SyncResolver 对象中不再有冲突行时发生解析器.在这个特定的代码片段中,解析器查找具有更新冲突的行(状态为 SyncResolver.UPDATE_ROW_CONFLICT 的行),此代码片段的其余部分仅针对发生冲突的行执行,因为crs正在尝试更新。
光标后解析器已经移动到下一个有更新冲突的冲突行,方法getRow表示当前行的编号,游标为CachedRowSet对象crs被移动到可比较的行crs.通过遍历该行的列解析器和crs,可以检索并比较冲突的值,以决定应保留哪个值。在此代码片段中,值在crs是设置为resolved value的那一个,意思就是会用来重写数据源中的冲突值。
try {
crs.acceptChanges(con);
} catch (SyncProviderException spe) {
SyncResolver resolver = spe.getSyncResolver();
Object crsValue; // value in the RowSet object
Object resolverValue: // value in the SyncResolver object
Object resolvedValue: // value to be persisted
while(resolver.nextConflict()) {
if(resolver.getStatus() == SyncResolver.UPDATE_ROW_CONFLICT) {
int row = resolver.getRow();
crs.absolute(row);
int colCount = crs.getMetaData().getColumnCount();
for(int j = 1; j <= colCount; j++) {
if (resolver.getConflictValue(j) != null) {
crsValue = crs.getObject(j);
resolverValue = resolver.getConflictValue(j);
. . .
// compare crsValue and resolverValue to determine
// which should be the resolved value (the value to persist)
resolvedValue = crsValue;
resolver.setResolvedValue(j, resolvedValue);
}
}
}
}
}
- 自从:
- 1.5
-
字段摘要
字段修饰符和类型Field描述static final int表示在RowSet对象试图删除数据源中的行时发生了冲突。static final int表示在RowSet对象试图将行插入数据源时发生了冲突。static final int表示noRowSet对象试图更新、删除或插入数据源中的行时发生冲突。static final int表示在RowSet对象尝试更新数据源中的行时发生了冲突。 -
方法总结
修饰符和类型方法描述getConflictValue(int index) 检索此SyncResolver对象当前行中指定列中的值,该值是数据源中导致冲突的值。getConflictValue(String columnName) 检索此SyncResolver对象当前行中指定列中的值,该值是数据源中导致冲突的值。int检索此SyncResolver的当前行的冲突状态,它指示发生冲突时RowSet对象正在尝试的操作。boolean将光标从其当前位置向下移动到包含冲突值的下一行。boolean将光标从其当前位置向上移动到此SyncResolver对象中的上一个冲突行。voidsetResolvedValue(int index, Object obj) 套对象作为列中的值指数在正在同步的RowSet对象的当前行中。voidsetResolvedValue(String columnName, Object obj) 套对象作为列中的值列名在正在同步的RowSet对象的当前行中。在接口 java.sql.ResultSet 中声明的方法
absolute, afterLast, beforeFirst, cancelRowUpdates, clearWarnings, close, deleteRow, findColumn, first, getArray, getArray, getAsciiStream, getAsciiStream, getBigDecimal, getBigDecimal, getBigDecimal, getBigDecimal, getBinaryStream, getBinaryStream, getBlob, getBlob, getBoolean, getBoolean, getByte, getByte, getBytes, getBytes, getCharacterStream, getCharacterStream, getClob, getClob, getConcurrency, getCursorName, getDate, getDate, getDate, getDate, getDouble, getDouble, getFetchDirection, getFetchSize, getFloat, getFloat, getHoldability, getInt, getInt, getLong, getLong, getMetaData, getNCharacterStream, getNCharacterStream, getNClob, getNClob, getNString, getNString, getObject, getObject, getObject, getObject, getObject, getObject, getRef, getRef, getRow, getRowId, getRowId, getShort, getShort, getSQLXML, getSQLXML, getStatement, getString, getString, getTime, getTime, getTime, getTime, getTimestamp, getTimestamp, getTimestamp, getTimestamp, getType, getUnicodeStream, getUnicodeStream, getURL, getURL, getWarnings, insertRow, isAfterLast, isBeforeFirst, isClosed, isFirst, isLast, last, moveToCurrentRow, moveToInsertRow, next, previous, refreshRow, relative, rowDeleted, rowInserted, rowUpdated, setFetchDirection, setFetchSize, updateArray, updateArray, updateAsciiStream, updateAsciiStream, updateAsciiStream, updateAsciiStream, updateAsciiStream, updateAsciiStream, updateBigDecimal, updateBigDecimal, updateBinaryStream, updateBinaryStream, updateBinaryStream, updateBinaryStream, updateBinaryStream, updateBinaryStream, updateBlob, updateBlob, updateBlob, updateBlob, updateBlob, updateBlob, updateBoolean, updateBoolean, updateByte, updateByte, updateBytes, updateBytes, updateCharacterStream, updateCharacterStream, updateCharacterStream, updateCharacterStream, updateCharacterStream, updateCharacterStream, updateClob, updateClob, updateClob, updateClob, updateClob, updateClob, updateDate, updateDate, updateDouble, updateDouble, updateFloat, updateFloat, updateInt, updateInt, updateLong, updateLong, updateNCharacterStream, updateNCharacterStream, updateNCharacterStream, updateNCharacterStream, updateNClob, updateNClob, updateNClob, updateNClob, updateNClob, updateNClob, updateNString, updateNString, updateNull, updateNull, updateObject, updateObject, updateObject, updateObject, updateObject, updateObject, updateObject, updateObject, updateRef, updateRef, updateRow, updateRowId, updateRowId, updateShort, updateShort, updateSQLXML, updateSQLXML, updateString, updateString, updateTime, updateTime, updateTimestamp, updateTimestamp, wasNull在接口 javax.sql.RowSet 中声明的方法
addRowSetListener, clearParameters, execute, getCommand, getDataSourceName, getEscapeProcessing, getMaxFieldSize, getMaxRows, getPassword, getQueryTimeout, getTransactionIsolation, getTypeMap, getUrl, getUsername, isReadOnly, removeRowSetListener, setArray, setAsciiStream, setAsciiStream, setAsciiStream, setAsciiStream, setBigDecimal, setBigDecimal, setBinaryStream, setBinaryStream, setBinaryStream, setBinaryStream, setBlob, setBlob, setBlob, setBlob, setBlob, setBlob, setBoolean, setBoolean, setByte, setByte, setBytes, setBytes, setCharacterStream, setCharacterStream, setCharacterStream, setCharacterStream, setClob, setClob, setClob, setClob, setClob, setClob, setCommand, setConcurrency, setDataSourceName, setDate, setDate, setDate, setDate, setDouble, setDouble, setEscapeProcessing, setFloat, setFloat, setInt, setInt, setLong, setLong, setMaxFieldSize, setMaxRows, setNCharacterStream, setNCharacterStream, setNCharacterStream, setNCharacterStream, setNClob, setNClob, setNClob, setNClob, setNClob, setNClob, setNString, setNString, setNull, setNull, setNull, setNull, setObject, setObject, setObject, setObject, setObject, setObject, setPassword, setQueryTimeout, setReadOnly, setRef, setRowId, setRowId, setShort, setShort, setSQLXML, setSQLXML, setString, setString, setTime, setTime, setTime, setTime, setTimestamp, setTimestamp, setTimestamp, setTimestamp, setTransactionIsolation, setType, setTypeMap, setUrl, setURL, setUsername在接口 java.sql.Wrapper 中声明的方法
isWrapperFor, unwrap
-
字段详细信息
-
UPDATE_ROW_CONFLICT
static final int UPDATE_ROW_CONFLICT表示在RowSet对象尝试更新数据源中的行时发生了冲突。要更新的数据源行中的值与RowSet对象对该行的原始值不同,这意味着自上次同步以来数据源中的行已被更新或删除。- 参见:
-
DELETE_ROW_CONFLICT
static final int DELETE_ROW_CONFLICT表示在RowSet对象试图删除数据源中的行时发生了冲突。要更新的数据源行中的值不同于RowSet对象对该行的原始值,这意味着自上次同步以来数据源中的行已被更新或删除。- 参见:
-
INSERT_ROW_CONFLICT
static final int INSERT_ROW_CONFLICT表示在RowSet对象试图将行插入数据源时发生了冲突。这意味着自上次同步以来,与要插入的行具有相同主键的行已经插入到数据源中。- 参见:
-
NO_ROW_CONFLICT
static final int NO_ROW_CONFLICT表示noRowSet对象试图更新、删除或插入数据源中的行时发生冲突。SyncResolver中的值将包含null值,仅作为指示没有与此行中的冲突解决相关的信息。- 参见:
-
-
方法详情
-
getStatus
int getStatus()检索此SyncResolver的当前行的冲突状态,它指示发生冲突时RowSet对象正在尝试的操作。- 返回:
-
以下常量之一:
SyncResolver.UPDATE_ROW_CONFLICT、SyncResolver.DELETE_ROW_CONFLICT、SyncResolver.INSERT_ROW_CONFLICT或SyncResolver.NO_ROW_CONFLICT
-
getConflictValue
检索此SyncResolver对象当前行中指定列中的值,该值是数据源中导致冲突的值。- 参数:
index- 一个int指定此SyncResolver对象的这一行中的列,从中检索导致冲突的值- 返回:
-
此
SyncResolver对象的当前行中指定列的值 - 抛出:
SQLException- 如果发生数据库访问错误
-
getConflictValue
检索此SyncResolver对象当前行中指定列中的值,该值是数据源中导致冲突的值。- 参数:
columnName- 一个String对象,指定此SyncResolver对象的这一行中的列,从中检索导致冲突的值- 返回:
-
此
SyncResolver对象的当前行中指定列的值 - 抛出:
SQLException- 如果发生数据库访问错误
-
setResolvedValue
套对象作为列中的值指数在正在同步的RowSet对象的当前行中。对象在内部设置为数据源中的值。- 参数:
index- 一个int给出要在其中设置要保留的值的列的编号obj- 一个Object,即要在RowSet对象中设置并保留在数据源中的值- 抛出:
SQLException- 如果发生数据库访问错误
-
setResolvedValue
套对象作为列中的值列名在正在同步的RowSet对象的当前行中。对象在内部设置为数据源中的值。- 参数:
columnName- 一个String对象,给出要在其中设置要持久保存的值的列的名称obj- 一个Object,即要在RowSet对象中设置并保留在数据源中的值- 抛出:
SQLException- 如果发生数据库访问错误
-
nextConflict
将光标从其当前位置向下移动到包含冲突值的下一行。SyncResolver对象的游标最初位于第一个冲突行之前;第一次调用方法nextConflict使第一个冲突行成为当前行;第二次调用使第二个冲突行成为当前行,依此类推。调用方法
nextConflict将隐式关闭输入流(如果输入流打开),并将清除SyncResolver对象的警告链。- 返回:
true如果新的当前行有效;false如果没有更多的行- 抛出:
SQLException- 如果发生数据库访问错误或结果集类型为TYPE_FORWARD_ONLY
-
previousConflict
将光标从其当前位置向上移动到此SyncResolver对象中的上一个冲突行。调用方法
previousConflict将隐式关闭输入流(如果输入流打开),并将清除SyncResolver对象的警告链。- 返回:
true如果游标在有效行上;false如果它不在结果集中- 抛出:
SQLException- 如果发生数据库访问错误或结果集类型为TYPE_FORWARD_ONLY
-