- すべてのスーパー・インタフェース:
AutoCloseable
,ResultSet
,RowSet
,Wrapper
競合とは、RowSet
オブジェクトの元の行の値がデータ・ソース内の値と一致しない状態であり、前回の同期以降にデータ・ソース行が変更されたことを示します。 RowSet
オブジェクトの元の値は、前回の同期の直前の値であり、必ずしも初期値ではありません。
SyncResolver
オブジェクトの説明
SyncResolver
オブジェクトは、SyncResolver
インタフェースを実装する特殊なRowSet
オブジェクトです。 これは接続されたRowSet
オブジェクト(JdbcRowSet
インタフェースの実装)または未接続のRowSet
オブジェクト(CachedRowSet
インタフェースまたはそのサブインタフェースの実装)として動作できます。 サブインタフェースについては、javax.sql.rowset
パッケージの説明を参照してください。 SyncResolver
のリファレンス実装はCachedRowSet
インタフェースを実装しますが、ほかの実装では、JdbcRowSet
インタフェースを実装して、特定の必要を満たすことができます。
アプリケーションが(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を使って、そこに含まれる競合(複数可)の情報を取得できます。 resolverなどのSyncResolver
オブジェクトは、競合がある各行で、その競合を追跡します。 また、行セットのコマンドの影響を受けるテーブル(複数可)にロックを適用して、現在の競合が解決されるまで新たに競合が発生しないようにします。
SyncResolver
オブジェクトから取得可能な情報は、次のとおりです。
競合発生時に試みられていた操作
SyncProvider
インタフェースは、発生する可能性のある状態について説明する4つの定数を定義します。 3つの定数は、競合が検出されたときRowSet
オブジェクトが試行していた操作の種類(更新、削除、または挿入)を表し、4番目は競合がないことを表します。 SyncResolver
オブジェクトがgetStatus
メソッドを呼び出したとき、これらの定数が戻り値として返される可能性のあるものです。
int operation = resolver.getStatus();
競合の原因になったデータ・ソース内の値
RowSet
オブジェクトによって値が変更され、データ・ソースに書き込まれるとき、書込み先のデータ・ソース内の値が前回同期処理を行なった時点とは異なっていた場合、競合が発生したことを表します。 SyncResolver
オブジェクトの値がデータ・ソースの競合値であるため、アプリケーションはSyncResolver
のgetConflictValue
メソッドを呼び出して、競合の原因となったデータ・ソース内の値を取り出すことができます。
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
メソッドを呼び出して、行に競合が含まれるかどうかを確認できます。 競合を含む行では、アプリケーションは列で反復処理を行い、null以外の値を見つけることができます。この値は競合のあるデータ・ソースの値になります。
SyncResolver
オブジェクトのナビゲートを簡単にするには、特に大半の行に競合がない場合に、SyncResolver
インタフェースでnextConflict
メソッドおよびpreviousConflict
メソッドを定義します。これらのメソッドは、少なくとも1つの競合値を含む行のみを移動します。 続いてアプリケーションで列番号を指定して、SyncResolver
のgetConflictValue
メソッドを呼び出し、競合値自体を取得します。 次のセクションのコードの抜粋に例を示します。
コード例
次のコードの抜粋は、未接続のRowSet
オブジェクトcrsが自身を配下のデータ・ソースと同期することで、競合を解決する方法を示しています。 try
ブロックで、crsはacceptChanges
メソッドを呼び出し、Connection
オブジェクトconを渡しています。 競合がない場合は、単にcrsの変更がデータ・ソースに書き込まれます。 しかし、競合がある場合は、acceptChanges
メソッドがSyncProviderException
オブジェクトをスローし、catch
ブロックが有効になります。 この例では、SyncResolver
オブジェクトを使用した多くの方法のうちの1つを説明しており、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; // 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 final int
RowSet
オブジェクトがデータ・ソース内の行の削除を試行したとき、競合が発生したことを表します。static final int
RowSet
オブジェクトがデータ・ソースへの行の挿入を試行したとき、競合が発生したことを表します。static final int
RowSet
オブジェクトがデータ・ソース内の行の更新、削除、または挿入を試行したとき、競合は発生しなかったことを表します。static final int
RowSet
オブジェクトがデータ・ソース内の行の更新を試行したとき、競合が発生したことを表します。インタフェース 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
-
メソッドのサマリー
修飾子と型メソッド説明getConflictValue
(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内の値として設定します。インタフェース 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_CONFLICTRowSet
オブジェクトがデータ・ソース内の行の更新を試行したとき、競合が発生したことを表します。 データ・ソース内の更新対象の行の値は、RowSet
オブジェクトの該当する行の元の値とは異なっています。つまり、データ・ソース内の行は、前回の同期処理の後更新されたか、削除されています。- 関連項目:
-
DELETE_ROW_CONFLICT
static final int DELETE_ROW_CONFLICTRowSet
オブジェクトがデータ・ソース内の行の削除を試行したとき、競合が発生したことを表します。 データ・ソース内の更新対象の行の値は、RowSet
オブジェクトの該当する行の元の値とは異なっています。つまり、データ・ソース内の行は、前回の同期処理の後更新されたか、削除されています。- 関連項目:
-
INSERT_ROW_CONFLICT
static final int INSERT_ROW_CONFLICTRowSet
オブジェクトがデータ・ソースへの行の挿入を試行したとき、競合が発生したことを表します。 前回の更新のあと、データ・ソースに挿入しようとした行と同じ主キーを持つ行が、すでに挿入されています。- 関連項目:
-
NO_ROW_CONFLICT
static final int NO_ROW_CONFLICTRowSet
オブジェクトがデータ・ソース内の行の更新、削除、または挿入を試行したとき、競合は発生しなかったことを表します。SyncResolver
内の値にはnull
値が含まれますが、これはこの行内に、競合の解決に関連する情報が含まれていないことを表しています。- 関連項目:
-
-
メソッドの詳細
-
getStatus
int getStatus()このSyncResolver
の現在の行の競合ステータスを取得します。これは、競合が発生したときRowSet
オブジェクトが試行していた操作を表します。- 戻り値:
- 次の定数のいずれか。
SyncResolver.UPDATE_ROW_CONFLICT
、SyncResolver.DELETE_ROW_CONFLICT
、SyncResolver.INSERT_ROW_CONFLICT
、またはSyncResolver.NO_ROW_CONFLICT
-
getConflictValue
このSyncResolver
オブジェクトの現在の行にある指定された列の値を取得します。この値が、競合の原因となったデータ・ソース内の値です。- パラメータ:
index
- このSyncResolver
オブジェクトのこの行内の列を指定するint
。この列から、競合の原因となった値を取得する- 戻り値:
- この
SyncResolver
オブジェクトの現在の行の指定された列の値 - 例外:
SQLException
- データベース・アクセス・エラーが発生した場合
-
getConflictValue
このSyncResolver
オブジェクトの現在の行にある指定された列の値を取得します。この値が、競合の原因となったデータ・ソース内の値です。- パラメータ:
columnName
- このSyncResolver
オブジェクトのこの行内の列を指定するString
オブジェクト。この列から、競合の原因となった値を取得する- 戻り値:
- この
SyncResolver
オブジェクトの現在の行の指定された列の値 - 例外:
SQLException
- データベース・アクセス・エラーが発生した場合
-
setResolvedValue
void setResolvedValue(int index, Object obj) throws SQLException objを、同期するRowSet
オブジェクトの現在の行の列index内の値として設定します。objは、内部でデータ・ソース内に値として設定されます。- パラメータ:
index
- 列番号を指定するint
。この列に、保持する値を設定するobj
-RowSet
オブジェクトに設定され、データ・ソースに残される値を示すObject
- 例外:
SQLException
- データベース・アクセス・エラーが発生した場合
-
setResolvedValue
void setResolvedValue(String columnName, Object obj) throws SQLException objを、同期するRowSet
オブジェクトの現在の行の列columnName内の値として設定します。objは、内部でデータ・ソース内に値として設定されます。- パラメータ:
columnName
- 列名を指定するString
オブジェクト。この列に、保持する値を設定するobj
-RowSet
オブジェクトに設定され、データ・ソースに残される値を示すObject
- 例外:
SQLException
- データベース・アクセス・エラーが発生した場合
-
nextConflict
boolean nextConflict() throws SQLExceptionカーソルを現在の位置から、競合する値を含む次の行に移動します。SyncResolver
オブジェクトのカーソルは、初期状態では最初の競合する行の前に位置付けられます。nextConflict
メソッドの最初の呼出しによって、最初の競合する行が現在の行になります。2回目の呼出しによって2番目の競合する行が現在の行になり、以下同様に続きます。nextConflict
メソッドへの呼出しによって、入力ストリームが開いていれば、暗黙的に閉じられ、SyncResolver
オブジェクトの警告チェーンがクリアされます。- 戻り値:
- 新しい現在の行が有効である場合は
true
、行がそれ以上存在しない場合はfalse
- 例外:
SQLException
- データベース・アクセス・エラーが発生した場合、または結果セットの型がTYPE_FORWARD_ONLY
の場合
-
previousConflict
boolean previousConflict() throws SQLExceptionカーソルを現在の位置から、このSyncResolver
オブジェクト内の前の競合する行に移動します。previousConflict
メソッドへの呼出しによって、入力ストリームが開いていれば、暗黙的に閉じられ、SyncResolver
オブジェクトの警告チェーンがクリアされます。- 戻り値:
- カーソルが有効な行にある場合は
true
、結果セットの外にある場合はfalse
- 例外:
SQLException
- データベース・アクセス・エラーが発生した場合、または結果セットの型がTYPE_FORWARD_ONLY
の場合
-