- 所有超接口:
-
AutoCloseable
,ResultSet
,RowSet
,Wrapper
请注意,冲突是指RowSet
对象的某一行的原始值与数据源中的值不匹配的情况,这表明自上次同步以来数据源行已被修改。还请注意,RowSet
对象的原始值是指在上次同步之前它所具有的值,并不一定是其初始值。
描述SyncResolver
对象
SyncResolver
对象是一个专门实现了SyncResolver
接口的RowSet
对象。它可以作为连接的RowSet
对象(实现了JdbcRowSet
接口)或连接的RowSet
对象(实现了CachedRowSet
接口或其子接口之一)运行。有关子接口的信息,请参阅javax.sql.rowset
包描述。 SyncResolver
的参考实现实现了CachedRowSet
接口,但其他实现可以选择实现JdbcRowSet
接口以满足特定需求。
当应用程序尝试将RowSet
对象与数据源同步(通过调用CachedRowSet
方法acceptChanges
),并且发现一个或多个冲突时,一个rowset的SyncProvider
对象会创建一个SyncResolver
实例。这个新的SyncResolver
对象与尝试同步的RowSet
对象具有相同数量的行和列。 SyncResolver
对象包含导致冲突的数据源值,对于所有其他值则为null
。此外,它还包含有关每个冲突的信息。
获取和使用SyncResolver
对象
当方法acceptChanges
遇到冲突时,SyncProvider
对象会创建一个SyncProviderException
对象,并将其设置为新的SyncResolver
对象。方法acceptChanges
将抛出此异常,应用程序可以捕获并使用它来检索其中包含的SyncResolver
对象。以下代码片段使用SyncProviderException
方法getSyncResolver
来获取SyncResolver
对象resolver。
catch (SyncProviderException spe) {
SyncResolver resolver = spe.getSyncResolver();
...
}
}
有了resolver,应用程序可以使用它来获取有关冲突的信息。例如,SyncResolver
对象(如resolver)会跟踪每个存在冲突的行的冲突。它还会对受到rowset命令影响的表或表放置锁定,以防止在解决当前冲突时发生更多冲突。
可以从SyncResolver
对象中获取以下类型的信息:
冲突发生时正在尝试的操作
SyncProvider
接口定义了四个描述可能发生的状态的常量。三个常量描述了当发现冲突时RowSet
对象尝试执行的操作类型(更新、删除或插入),第四个指示没有冲突。当SyncResolver
对象调用方法getStatus
时,这些常量是可能的返回值。
int operation = resolver.getStatus();
导致冲突的数据源中的值
当RowSet
对象已更改并尝试写入数据源的值在自上次同步以来也已在数据源中更改时,就会出现冲突。应用程序可以调用SyncResolver
方法getConflictValue
来检索导致冲突的数据源中的值,因为SyncResolver
对象中的值是来自数据源的冲突值。
java.lang.Object conflictValue = resolver.getConflictValue(2);请注意,resolver中的列可以通过列号指定,就像在上述代码行中所做的那样,也可以通过列名指定。
通过从方法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
对象con。如果没有冲突,则acceptChanges
会抛出一个
SyncProviderException
对象,然后
catch
块生效。在这个示例中,展示了
SyncResolver
对象的一种用法,
SyncResolver
方法
nextConflict
在一个
while
循环中使用。当
nextConflict
返回
false
时,循环将结束,这将在
SyncResolver
对象
resolver中没有更多冲突行时发生。在这个特定的代码片段中,
resolver查找具有更新冲突的行(具有状态
SyncResolver.UPDATE_ROW_CONFLICT
的行),并且仅对因为
crs尝试更新而发生冲突的行执行此代码片段的其余部分。
在resolver
的光标移动到具有更新冲突的下一个冲突行后,方法getRow
指示当前行的编号,CachedRowSet
对象crs的光标移动到crs中的可比较行。通过在resolver
和crs
中的该行的列上进行迭代,可以检索并比较冲突值,以决定应该持久化哪个值。在这个代码片段中,crs中的值被设置为解决值,这意味着它将用于覆盖数据源中的冲突值。
try {
crs.acceptChanges(con);
} catch (SyncProviderException spe) {
SyncResolver resolver = spe.getSyncResolver();
Object crsValue; // RowSet对象中的值
Object resolverValue: // SyncResolver对象中的值
Object resolvedValue: // 要持久化的值
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);
. . .
// 比较crsValue和resolverValue以确定
// 哪个应该是解决值(要持久化的值)
resolvedValue = crsValue;
resolver.setResolvedValue(j, resolvedValue);
}
}
}
}
}
- 自JDK版本:
- 1.5
-
Field Summary
Modifier and TypeFieldDescriptionstatic final int
表示RowSet
对象尝试从数据源中删除行时发生冲突。static final int
表示RowSet
对象尝试向数据源中插入行时发生冲突。static final int
表示RowSet
对象尝试更新、删除或插入数据源中的行时没有发生冲突。static final int
表示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
-
Method Summary
Modifier and TypeMethodDescriptiongetConflictValue
(int index) 检索当前行中指定列的值,该行位于此SyncResolver
对象中,该值是导致冲突的数据源中的值。getConflictValue
(String columnName) 检索当前行中指定列的值,该行位于此SyncResolver
对象中,该值是导致冲突的数据源中的值。int
检索此SyncResolver
当前行的冲突状态,该状态指示RowSet
对象在冲突发生时尝试的操作。boolean
将光标从当前位置向下移动到下一行,该行包含冲突值。boolean
将光标从当前位置向上移动到此SyncResolver
对象中的上一冲突行。void
setResolvedValue
(int index, Object obj) 将obj设置为正在同步的RowSet
对象当前行中列index的值。void
setResolvedValue
(String columnName, Object obj) 将obj设置为正在同步的RowSet
对象当前行中列columnName的值。Methods declared in 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 declared in 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 declared in interface java.sql.Wrapper
isWrapperFor, unwrap
-
Field Details
-
UPDATE_ROW_CONFLICT
static final int UPDATE_ROW_CONFLICT指示在RowSet
对象尝试更新数据源中的行时发生冲突。数据源行中要更新的值与该行的原始值不同,这意味着自上次同步以来,数据源中的行已被更新或删除。- 参见:
-
DELETE_ROW_CONFLICT
static final int DELETE_ROW_CONFLICT指示在RowSet
对象尝试从数据源中删除行时发生冲突。要更新的数据源行中的值与该行的原始值不同,这意味着自上次同步以来,数据源中的行已被更新或删除。- 参见:
-
INSERT_ROW_CONFLICT
static final int INSERT_ROW_CONFLICT指示在RowSet
对象尝试将行插入数据源时发生冲突。这意味着自上次同步以来,已将具有与要插入的行相同主键的行插入到数据源中。- 参见:
-
NO_ROW_CONFLICT
static final int NO_ROW_CONFLICT指示在RowSet
对象尝试更新、删除或插入数据源中的行时未发生冲突。SyncResolver
中的值仅包含null
值,表示在此行的冲突解决中没有相关信息。- 参见:
-
-
Method Details
-
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
将obj设置为正在同步的RowSet
对象当前行中列index的值。 obj在内部设置为数据源中的值。- 参数:
-
index
- 一个int
,表示要将值设置为要持久化的列的编号 -
obj
- 一个Object
,是要在RowSet
对象中设置并在数据源中持久化的值 - 抛出:
-
SQLException
- 如果发生数据库访问错误
-
setResolvedValue
将obj设置为正在同步的RowSet
对象当前行中列columnName的值。 obj在内部设置为数据源中的值。- 参数:
-
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
-