public interface SyncResolver extends RowSet
请注意,冲突是一种情况,其中RowSet
对象的原始值与数据源中的值不匹配,这表示自上次同步以来数据源行已被修改。 还要注意, RowSet
对象的原始值是它刚刚进行最后一次同步之前的值,它们不一定是其初始值。
SyncResolver
对象的描述 SyncResolver
对象是一个专门的RowSet
对象,实现了SyncResolver
接口。
它可以作为连接的RowSet
对象(JdbcRowSet JdbcRowSet
实现)或连接的RowSet
对象(CachedRowSet接口的实现CachedRowSet
子接口之一)来操作。
有关子接口的信息,请参阅javax.sql.rowset
程序包说明。
SyncResolver的参考实现SyncResolver
了CachedRowSet
接口,但其他实现可以选择实现JdbcRowSet
接口以满足特定需求。
应用程序尝试同步RowSet
对象与数据源(通过调用CachedRowSet
方法acceptChanges
)并发现一个或多个冲突后,行集的SyncProvider
对象创建一个SyncResolver
的实例。 这种新SyncResolver
对象具有相同的行数和列作为的RowSet
对象,试图同步。 SyncResolver
对象包含导致冲突的数据源的值,所有其他值都null
。 此外,它还包含有关每个冲突的信息。
SyncResolver
对象 acceptChanges
遇到冲突时, SyncProvider
对象将创建一个SyncProviderException
对象,并使用新的SyncResolver
对象进行设置。
方法acceptChanges
将抛出该异常,应用程序然后可以捕获并使用该SyncResolver
来检索其包含的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
,该方法setResolvedValue
值设置为RowSet
对象以及数据源中的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
对象con 。
如果没有冲突,则crs中的更改只会写入数据源。
但是,如果有冲突,方法acceptChanges
抛出一个SyncProviderException
对象,并且catch
块生效。
在这个例子中,它说明了可以使用SyncResolver
对象的多种方式之一, SyncResolver
方法nextConflict
用在while
循环中。
当nextConflict
返回false
时,循环将结束,当SyncResolver
对象解析器中没有更多的冲突行时,该SyncResolver
将会发生。
在这个特定的代码片段中, 解析器查找具有更新冲突的行(行状态为SyncResolver.UPDATE_ROW_CONFLICT
),并且此代码片段的其余部分仅针对发生冲突的行执行,因为crs正在尝试更新。
光标进行分解器已移动到下一个冲突行具有更新冲突之后,该方法getRow
表示当前行的数目,并且光标为CachedRowSet
对象crs被移动到可比较的行中的CRS。 通过在解析器和crs中遍历该行的列,可以检索和比较冲突的值以确定应该保留哪个值。 在这个代码片段中, crs中的值是一个设置为解析值,这意味着它将被用于覆盖数据源中的冲突值。
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); } } } } }
Modifier and Type | Field and Description |
---|---|
static int |
DELETE_ROW_CONFLICT
表示在
RowSet 对象尝试删除数据源中的行时发生冲突。
|
static int |
INSERT_ROW_CONFLICT
表示
RowSet 对象试图将一行插入数据源时发生冲突。
|
static int |
NO_ROW_CONFLICT
表示
RowSet 对象尝试更新,删除或插入数据源中的一行时
不会发生冲突。
|
static int |
UPDATE_ROW_CONFLICT
表示在
RowSet 对象尝试更新数据源中的行时发生冲突。
|
CLOSE_CURSORS_AT_COMMIT, CONCUR_READ_ONLY, CONCUR_UPDATABLE, FETCH_FORWARD, FETCH_REVERSE, FETCH_UNKNOWN, HOLD_CURSORS_OVER_COMMIT, TYPE_FORWARD_ONLY, TYPE_SCROLL_INSENSITIVE, TYPE_SCROLL_SENSITIVE
Modifier and Type | Method and Description |
---|---|
Object |
getConflictValue(int index)
检索此
SyncResolver 对象的当前行中指定列中的值,该值是导致冲突的数据源中的值。
|
Object |
getConflictValue(String columnName)
检索此
SyncResolver 对象当前行中指定列中的值,该对象是导致冲突的数据源中的值。
|
int |
getStatus()
检索此
SyncResolver 的当前行的冲突状态,表示发生冲突时
RowSet 对象正在尝试的操作。
|
boolean |
nextConflict()
将光标从当前位置向下移动到包含冲突值的下一行。
|
boolean |
previousConflict()
将光标从当前位置向上移动到此
SyncResolver 对象中的上一个冲突行。
|
void |
setResolvedValue(int index, Object obj)
将
obj设置为正在同步的
RowSet 对象的当前行中的列
索引中的值。
|
void |
setResolvedValue(String columnName, Object obj)
将
obj设置为正在同步的
RowSet 对象的当前行中列
columnName中的值。
|
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
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
isWrapperFor, unwrap
static final int UPDATE_ROW_CONFLICT
RowSet
对象尝试更新数据源中的行时发生冲突。
要更新的数据源行中的值与该行的RowSet
对象的原始值不同,这意味着自上次同步以来,数据源中的行已被更新或删除。
static final int DELETE_ROW_CONFLICT
RowSet
对象尝试删除数据源中的行时发生冲突。
要更新的数据源行中的值与该行的RowSet
对象的原始值不同,这意味着自上次同步以来,数据源中的行已被更新或删除。
static final int INSERT_ROW_CONFLICT
RowSet
对象尝试将一行插入数据源时发生冲突。
这意味着自上次同步以来,与要插入的行具有相同主键的行已经被插入到数据源中。
static final int NO_ROW_CONFLICT
RowSet
对象尝试在数据源中更新,删除或插入行时不会发生冲突。
在值SyncResolver
将包含null
值仅作为指示,在有关冲突解决此行中的信息。
int getStatus()
SyncResolver
的当前行的冲突状态,该状态指示当发生冲突时
RowSet
对象正在尝试的操作。
SyncResolver.UPDATE_ROW_CONFLICT
,
SyncResolver.DELETE_ROW_CONFLICT
,
SyncResolver.INSERT_ROW_CONFLICT
,或
SyncResolver.NO_ROW_CONFLICT
Object getConflictValue(int index) throws SQLException
SyncResolver
对象的当前行中指定列中的值,该值是导致冲突的数据源中的值。
index
- 一个
int
指定此
SyncResolver
对象的此行中的列,以从中检索导致冲突的值
SyncResolver
对象当前行中指定列的值
SQLException
- 如果发生数据库访问错误
Object getConflictValue(String columnName) throws SQLException
SyncResolver
对象的当前行中指定列中的值,该值是导致冲突的数据源中的值。
columnName
- 一个
String
对象,指定此
SyncResolver
对象的此行中的列,以从中检索导致冲突的值
SyncResolver
对象当前行中指定列的值
SQLException
- 如果发生数据库访问错误
void setResolvedValue(int index, Object obj) throws SQLException
RowSet
对象的当前行中的列索引中的值。
obj被设置为数据源内部的值。
index
- 一个
int
给出了要设置要持久化的值的列数
obj
- 一个
Object
,它是在
RowSet
对象中设置的值,并持续存储在数据源中
SQLException
- 如果发生数据库访问错误
void setResolvedValue(String columnName, Object obj) throws SQLException
RowSet
对象的当前行中的列columnName中的值。
obj被设置为数据源内部的值。
columnName
- 一个
String
对象,给出设置要持久化的值的列的名称
obj
- 一个
Object
,它是在
RowSet
对象中设置的值,并持续存在于数据源
SQLException
- 如果发生数据库访问错误
boolean nextConflict() throws SQLException
SyncResolver
对象的光标最初位于第一个冲突行之前;
方法nextConflict
的第一次调用使得第一冲突行成为当前行;
第二个调用使第二个冲突行成为当前行,依此类推。
对方法nextConflict
调用将隐式关闭输入流,如果一个打开,并清除SyncResolver
对象的警告链。
true
如果新的当前行有效;
false
如果没有更多的行
SQLException
- 如果发生数据库访问错误或结果集类型为
TYPE_FORWARD_ONLY
boolean previousConflict() throws SQLException
SyncResolver
对象中之前的冲突行。
对方法previousConflict
调用将隐式关闭输入流,如果一个打开,并清除SyncResolver
对象的警告链。
true
如果光标在有效的行上;
false
如果它是关闭结果集
SQLException
- 如果发生数据库访问错误或结果集类型为
TYPE_FORWARD_ONLY