-
- All Superinterfaces:
-
AutoCloseable
,ResultSet
,RowSet
,Wrapper
public interface SyncResolver extends RowSet
定义一个框架,允许应用程序使用手动决策树来决定在发生同步冲突时应该做什么。 虽然应用程序不是手动解决同步冲突是强制性的,但是该框架提供了在冲突发生时委托给应用程序的方法。请注意,冲突是一种情况,其中
RowSet
对象的原始值与数据源中的值不匹配,这表示自上次同步以来数据源行已被修改。 还要注意,一个RowSet
对象的原始值是它刚刚在最后一次同步之前的值,它们不一定是其初始值。SyncResolver
对象的描述SyncResolver
对象是一个专门的RowSet
对象,实现了SyncResolver
接口。 它可以作为连接的RowSet
对象(JdbcRowSet
接口的实现)或连接的RowSet
对象(CachedRowSet
接口的实现或其子接口之一)来操作。 有关子接口的信息,请参阅javax.sql.rowset
程序包说明。SyncResolver
的参考实现实现了CachedRowSet
接口,但其他实现可能会选择实现JdbcRowSet
接口来满足特定需求。在应用程序尝试将
RowSet
对象与数据源同步(通过调用CachedRowSet
方法acceptChanges
)并发现一个或多个冲突后,行集的SyncProvider
对象将创建一个SyncResolver
的实例。 这个新的RowSet
对象与正在尝试同步的SyncResolver
对象具有相同数量的行和列。SyncResolver
对象包含导致冲突的数据源的值和所有其他值的值为null
。 此外,它还包含有关每个冲突的信息。获取和使用
当方法SyncResolver
对象acceptChanges
遇到冲突时,SyncProvider
对象将创建一个SyncProviderException
对象并将其设置为新的SyncResolver
对象。 方法acceptChanges
将抛出该异常,应用程序然后可以捕获并使用该异常来检索其所包含的SyncResolver
对象。 以下代码片段使用SyncProviderException
方法getSyncResolver
获取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
-
-
Field Summary
Fields Modifier and Type Field 描述 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 inherited from 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
-
-
方法摘要
所有方法 接口方法 抽象方法 Modifier and Type 方法 描述 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中的值。-
Methods inherited from interface 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
-
Methods inherited from interface 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
-
Methods inherited from interface java.sql.Wrapper
isWrapperFor, unwrap
-
-
-
-
字段详细信息
-
UPDATE_ROW_CONFLICT
static final int UPDATE_ROW_CONFLICT
表示RowSet
对象尝试更新数据源中的行时发生冲突。 要更新的数据源行中的值与该行的RowSet
对象的原始值不同,这意味着自上次同步以来,数据源中的行已被更新或删除。- 另请参见:
- Constant Field Values
-
DELETE_ROW_CONFLICT
static final int DELETE_ROW_CONFLICT
表示在RowSet
对象尝试删除数据源中的行时发生冲突。 要更新的数据源行中的值与该行的RowSet
对象的原始值不同,这意味着自上次同步以来,数据源中的行已被更新或删除。- 另请参见:
- Constant Field Values
-
INSERT_ROW_CONFLICT
static final int INSERT_ROW_CONFLICT
表示在RowSet
对象尝试将一行插入数据源时发生冲突。 这意味着自上次同步以来,与要插入的行具有相同主键的行已经被插入到数据源中。- 另请参见:
- Constant Field Values
-
NO_ROW_CONFLICT
static final int NO_ROW_CONFLICT
表示RowSet
对象尝试更新,删除或插入数据源中的一行时不会发生冲突。 在值SyncResolver
将包含null
值仅作为指示,在有关冲突解决此行中的信息。- 另请参见:
- Constant Field Values
-
-
方法详细信息
-
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
给出设置要持久化的值的列数 -
obj
- 一个Object
,这是在RowSet
对象中设置的值,并持续存在于数据源 - 异常
-
SQLException
- 如果发生数据库访问错误
-
setResolvedValue
void setResolvedValue(String columnName, Object obj) throws SQLException
将obj设置为正在同步的RowSet
对象的当前行中的列columnName中的值。 obj被设置为数据源内部的值。- 参数
-
columnName
- 一个String
对象,给出设置要持久化的值的列的名称 -
obj
- 一个Object
,这是在RowSet
对象中设置的值,并持续存在于数据源 - 异常
-
SQLException
- 如果发生数据库访问错误
-
nextConflict
boolean nextConflict() throws SQLException
将光标从当前位置向下移动到包含冲突值的下一行。 一个SyncResolver
对象的光标最初位于第一个冲突行之前; 方法nextConflict
的第一次调用使得第一冲突行成为当前行; 第二个调用使第二个冲突行成为当前行,依此类推。方法
nextConflict
调用将隐式关闭输入流,如果一个打开,并清除SyncResolver
对象的警告链。- 结果
-
true
如果新的当前行有效;false
如果没有更多的行 - 异常
-
SQLException
- 如果发生数据库访问错误或结果集类型为TYPE_FORWARD_ONLY
-
previousConflict
boolean previousConflict() throws SQLException
将光标从当前位置向上移动到此SyncResolver
对象中的上一个冲突行。方法
previousConflict
调用将隐式关闭输入流,如果一个打开,并清除SyncResolver
对象的警告链。- 结果
-
true
如果光标在有效的行上;false
如果它是关闭结果集 - 异常
-
SQLException
- 如果发生数据库访问错误或结果集类型为TYPE_FORWARD_ONLY
-
-