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, setUsernameabsolute, 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, wasNullisWrapperFor, unwrapstatic 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
Submit a bug or feature
For further API reference and developer documentation, see Java SE Documentation. That documentation contains more detailed, developer-targeted descriptions, with conceptual overviews, definitions of terms, workarounds, and working code examples.
Copyright © 1993, 2014, Oracle and/or its affiliates. All rights reserved.