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 theRowSet
object Object resolverValue: // value in theSyncResolver
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, 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, 2013, Oracle and/or its affiliates. All rights reserved.