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