|
JavaTM Platform Standard Ed. 6 |
|||||||||
| 前のクラス 次のクラス | フレームあり フレームなし | |||||||||
| 概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド | |||||||||
public interface SyncResolver
アプリケーションが、手動の意志決定ツリーを使って同期競合が発生したときの対処方法を決定できるようにするフレームワークを定義します。アプリケーションが同期競合を手動で解決することは必須ではありませんが、このフレームワークは競合が発生したときにアプリケーションに委譲する手段を提供します。
競合とは、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 オブジェクトがデータソース内の行の更新を試行したとき、競合が発生したことを表します。 |
| インタフェース 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 |
| メソッドの概要 | |
|---|---|
Object |
getConflictValue(int index)
この SyncResolver オブジェクトの現在の行にある指定された列の値を取得します。 |
Object |
getConflictValue(String columnName)
この SyncResolver オブジェクトの現在の行にある指定された列の値を取得します。 |
int |
getStatus()
この SyncResolver の現在の行の競合ステータスを取得します。 |
boolean |
nextConflict()
カーソルを現在の位置から、競合する値を含む次の行に移動します。 |
boolean |
previousConflict()
カーソルを現在の位置から、この SyncResolver オブジェクト内の前の競合する行に移動します。 |
void |
setResolvedValue(int index,
Object obj)
obj を、同期する RowSet オブジェクトの現在の行の列 index 内の値として設定します。 |
void |
setResolvedValue(String columnName,
Object obj)
obj を、同期する RowSet オブジェクトの現在の行の列 columnName 内の値として設定します。 |
| インタフェース java.sql.Wrapper から継承されたメソッド |
|---|
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_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 オブジェクトに設定され、 データソースに残される値を示す Object
SQLException - データベースアクセスエラーが発生した場合void setResolvedValue(String columnName, Object obj) throws SQLException
RowSet オブジェクトの現在の行の列 columnName 内の値として設定します。obj は、内部でデータソース内に値として設定されます。
columnName - 列名を指定する String オブジェクト。 この列に、保持する値を設定するobj - RowSet オブジェクトに設定され、 データソースに残される値を示す Object
SQLException - データベースアクセスエラーが発生した場合
boolean nextConflict()
throws SQLException
nextConflict()メソッドの最初の呼び出しによって、最初の競合する行が現在の行になります。 2 回目の呼び出しによって 2 番目の競合する行が現在の行になり、以下同様に続きます。
nextConflict メソッドへの呼び出しによって、入力ストリームが開いていれば、暗黙的に閉じられ、SyncResolverオブジェクトの警告チェーンが消去されます。
true、それ以上行がない場合は false
SQLException - データベースアクセスエラーが発生した場合、 または結果セットの型が TYPE_FORWARD_ONLY の場合
boolean previousConflict()
throws SQLException
SyncResolver オブジェクト内の前の競合する行に移動します。
previousConflictメソッドへの呼び出しによって、入力ストリームが開いていれば、暗黙的に閉じられ、SyncResolverオブジェクトの警告チェーンが消去されます。
true、 結果セットの外にある場合は false
SQLException - データベースアクセスエラーが発生した場合、 または結果セットの型が TYPE_FORWARD_ONLY の場合
|
JavaTM Platform Standard Ed. 6 |
|||||||||
| 前のクラス 次のクラス | フレームあり フレームなし | |||||||||
| 概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド | |||||||||
Copyright 2009 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Documentation Redistribution Policy も参照してください。