-
- All Superinterfaces:
-
AutoCloseable
,ResultSet
,RowSet
,Wrapper
public interface SyncResolverextends RowSet
定义一个框架,允许应用程序使用手动决策树来决定发生同步冲突时应该执行的操作。 虽然应用程序不必手动解决同步冲突,但此框架提供了在发生冲突时委派给应用程序的方法。请注意,冲突是
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
对象解析程序 。有了解析器 ,应用程序可以使用它来获取它包含的有关冲突或冲突的信息。 诸如解析器之
SyncResolver
对象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
在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.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); } } } } }
- 从以下版本开始:
- 1.5
-
-
字段汇总
字段 变量和类型 字段 描述 static int
DELETE_ROW_CONFLICT
表示RowSet
对象尝试删除数据源中的行时发生冲突。static int
INSERT_ROW_CONFLICT
表示RowSet
对象尝试在数据源中插入行时发生冲突。static int
NO_ROW_CONFLICT
表示RowSet
对象尝试更新,删除或在数据源中插入行时 未发生冲突。static int
UPDATE_ROW_CONFLICT
表示RowSet
对象尝试更新数据源中的行时发生冲突。-
Fields declared in interface java.sql.ResultSet
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
-
-
方法摘要
所有方法 实例方法 抽象方法 变量和类型 方法 描述 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列中的值。-
声明方法的接口 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
表示RowSet
对象尝试更新,删除或在数据源中插入行时未发生冲突。 在值SyncResolver
将包含null
值仅作为指示,在有关冲突解决此行中的信息。- 另请参见:
- 常数字段值
-
-
方法详细信息
-
getStatus
int getStatus()
检索此SyncResolver
的当前行的冲突状态,该行指示RowSet
对象在发生冲突时尝试的操作。- 结果
- 以下常数之一:
SyncResolver.UPDATE_ROW_CONFLICT
,SyncResolver.DELETE_ROW_CONFLICT
,SyncResolver.INSERT_ROW_CONFLICT
,或SyncResolver.NO_ROW_CONFLICT
-
getConflictValue
Object getConflictValue(int index) throws SQLException
检索此SyncResolver
对象的当前行中指定列中的值,该值是导致冲突的数据源中的值。- 参数
-
index
- 一个int
指定此SyncResolver
对象的此行中的列,从中检索导致冲突的值 - 结果
- 此
SyncResolver
对象的当前行中指定列的值 - 异常
-
SQLException
- 如果发生数据库访问错误
-
getConflictValue
Object getConflictValue(String columnName) throws SQLException
检索此SyncResolver
对象的当前行中指定列中的值,该值是导致冲突的数据源中的值。- 参数
-
columnName
- 一个String
对象,指定此SyncResolver
对象的此行中的列,从中检索导致冲突的值 - 结果
- 此
SyncResolver
对象的当前行中指定列的值 - 异常
-
SQLException
- 如果发生数据库访问错误
-
setResolvedValue
void setResolvedValue(int index, Object obj) throws SQLException
将obj设置为正在同步的RowSet
对象的当前行中的列索引中的值。 obj在内部设置为数据源中的值。- 参数
-
index
-int
给出要设置要int
的值的列的编号 -
obj
- 一个Object
,它是要在RowSet
对象中设置并RowSet
在数据源中的值 - 异常
-
SQLException
- 如果发生数据库访问错误
-
setResolvedValue
void setResolvedValue(String columnName, Object obj) throws SQLException
将obj设置为正在同步的RowSet
对象的当前行中columnName列中的值。 obj在内部设置为数据源中的值。- 参数
-
columnName
- 一个String
对象,给出要在其中设置要String
的值的列的名称 -
obj
- 一个Object
,它是要在RowSet
对象中设置并RowSet
在数据源中的值 - 异常
-
SQLException
- 如果发生数据库访问错误
-
nextConflict
boolean nextConflict() throws SQLException
将光标从当前位置向下移动到包含冲突值的下一行。SyncResolver
对象的光标最初位于第一个冲突行之前; 第一次调用方法nextConflict
使第一个冲突行成为当前行; 第二个调用使第二个冲突行成为当前行,依此类推。如果一个输入流打开并且将清除
SyncResolver
对象的警告链,则对方法nextConflict
调用将隐式关闭输入流。- 结果
-
true
如果新的当前行有效;false
如果没有更多行 - 异常
-
SQLException
- 如果发生数据库访问错误或结果集类型为TYPE_FORWARD_ONLY
-
previousConflict
boolean previousConflict() throws SQLException
将光标从当前位置向上移动到此SyncResolver
对象中的上一个冲突行。如果一个输入流打开并且将清除
SyncResolver
对象的警告链,则对方法previousConflict
调用将隐式关闭输入流。- 结果
-
true
如果光标在有效行上;false
如果它不在结果集中 - 异常
-
SQLException
- 如果发生数据库访问错误或结果集类型为TYPE_FORWARD_ONLY
-
-