public interface SyncResolver extends RowSet
競合とは、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);
}
}
}
}
}
修飾子と型 | フィールドと説明 |
---|---|
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
修飾子と型 | メソッドと説明 |
---|---|
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 オブジェクトの現在の行の列index内の値として設定します。 |
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, setUsername
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
isWrapperFor, unwrap
static 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
- このSyncResolver
オブジェクトのこの行内の列を指定するint
。この列から、競合の原因となった値を取得するSyncResolver
オブジェクトの現在の行の指定された列の値SQLException
- データベース・アクセス・エラーが発生した場合Object getConflictValue(String columnName) throws SQLException
SyncResolver
オブジェクトの現在の行にある指定された列の値を取得します。この値が、競合の原因となったデータ・ソース内の値です。columnName
- このSyncResolver
オブジェクトのこの行内の列を指定するString
オブジェクト。この列から、競合の原因となった値を取得するSyncResolver
オブジェクトの現在の行の指定された列の値SQLException
- データベース・アクセス・エラーが発生した場合void setResolvedValue(int index, Object obj) throws SQLException
RowSet
オブジェクトの現在の行の列index内の値として設定します。objは、内部でデータ・ソース内に値として設定されます。index
- 列番号を指定するint
。この列に、保持する値を設定するobj
- RowSet
オブジェクトに設定され、データ・ソースに残される値を示すObject
SQLException
- データベース・アクセス・エラーが発生した場合void setResolvedValue(String columnName, Object obj) throws SQLException
RowSet
オブジェクトの現在の行の列columnName内の値として設定します。objは、内部でデータ・ソース内に値として設定されます。columnName
- 列名を指定するString
オブジェクト。この列に、保持する値を設定するobj
- RowSet
オブジェクトに設定され、データ・ソースに残される値を示すObject
SQLException
- データベース・アクセス・エラーが発生した場合boolean nextConflict() throws SQLException
SyncResolver
オブジェクトのカーソルは、初期状態では最初の競合する行の前に位置付けられます。nextConflict
メソッドの最初の呼出しによって、最初の競合する行が現在の行になります。2回目の呼出しによって2番目の競合する行が現在の行になり、以下同様に続きます。
nextConflict
メソッドへの呼出しによって、入力ストリームが開いていれば、暗黙的に閉じられ、SyncResolver
オブジェクトの警告チェーンが消去されます。
true
、行がそれ以上存在しない場合はfalse
SQLException
- データベース・アクセス・エラーが発生した場合、または結果セットの型がTYPE_FORWARD_ONLY
の場合boolean previousConflict() throws SQLException
SyncResolver
オブジェクト内の前の競合する行に移動します。
previousConflict
メソッドへの呼出しによって、入力ストリームが開いていれば、暗黙的に閉じられ、SyncResolver
オブジェクトの警告チェーンが消去されます。
true
、結果セットの外にある場合はfalse
SQLException
- データベース・アクセス・エラーが発生した場合、または結果セットの型がTYPE_FORWARD_ONLY
の場合 バグまたは機能を送信
詳細なAPIリファレンスおよび開発者ドキュメントについては、Java SEのドキュメントを参照してください。そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright© 1993, 2014, Oracle and/or its affiliates. All rights reserved.