|
JavaTM 2 Platform Standard Ed. 5.0 |
|||||||||
| 前のクラス 次のクラス | フレームあり フレームなし | |||||||||
| 概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド | |||||||||
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内
の値として設定します。 |
| フィールドの詳細 |
|---|
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 の場合
|
JavaTM 2 Platform Standard Ed. 5.0 |
|||||||||
| 前のクラス 次のクラス | フレームあり フレームなし | |||||||||
| 概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド | |||||||||
Copyright 2004 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Documentation Redistribution Policy も参照してください。