インタフェース | 説明 |
---|---|
SyncResolver |
アプリケーションが、手動の意志決定ツリーを使って同期競合が発生したときの対処方法を決定できるようにするフレームワークを定義します。
|
TransactionalWriter |
より精密なトランザクション制御ができるように、標準
SyncProvider abstractクラスの拡張を促進する特別なインタフェースです。 |
XmlReader |
SyncProvider 抽象クラスの拡張を促進する、XML指向の同期プロバイダ向けの特別なインタフェースです。 |
XmlWriter |
SyncProvider 抽象クラスの拡張を促進する、XML指向の同期プロバイダ向けの特別なインタフェースです。 |
クラス | 説明 |
---|---|
SyncFactory |
未接続の
RowSet オブジェクトによって使用されるSyncProvider インスタンスを生成するサービス・プロバイダ・インタフェース(Service Provider Interface、SPI)メカニズムです。 |
SyncProvider |
未接続の
RowSet オブジェクトの読み取り/書込み機能を提供する同期メカニズムです。 |
例外 | 説明 |
---|---|
SyncFactoryException |
SyncFactory メカニズムのエラーを示します。 |
SyncProviderException |
SyncProvider メカニズムで発生したエラーを示します。 |
SyncProvider
実装の一覧が記載されたJDBC Webページにベンダー固有の実装を追加して、開発者に実装を公開したい場合は、[email protected]
まで電子メールにてご連絡ください。そうすれば、開発者がその実装に気づきやすくなります。RowSet
オブジェクトで実装を使用できるようにするには、その実装をSyncFactory
シングルトンに登録する必要があります。登録手順と命名規則の詳しい説明については、SyncProvider
のクラス・コメントを参照してください。
javax.sql.rowset.spi
パッケージは、次のクラスおよびインタフェースで構成されています。
SyncFactory
SyncProvider
SyncFactoryException
SyncProviderException
SyncResolver
XmlReader
XmlWriter
TransactionalWriter
javax.sql
パッケージ内の次のインタフェースも含まれています。
RowSetReader
RowSetWriter
SyncProvider
実装は、未接続のRowSet
オブジェクトがデータを読み込み、変更を加えたあと配下のデータ・ソースに再度書き込めるようにするメカニズムを提供します。リーダーオブジェクト(RowSetReader
またはXMLReader
)は、CachedRowSet
のexecute
またはpopulate
メソッドが呼び出されると、RowSet
オブジェクトにデータを読み込みます。ライターオブジェクト(RowSetWriter
またはXMLWriter
)は、CachedRowSet
のacceptChanges
メソッドが呼び出されると、配下のデータ・ソースに変更されたデータを書き込みます。
RowSet
オブジェクトの変更内容をデータ・ソースに書き込む処理を同期と呼びます。RowSet
オブジェクトのライターが使用する同期のレベルは、RowSet
オブジェクトのSyncProvider
実装によって決定されます。同期のさまざまなレベルのことをグレードと呼びます。
低グレードの同期は、競合がまったく存在しないか、存在したとしてもわずかであるというオプティミスティック(楽観的)な想定のもとに行われます。この同期モデルをオプティミスティック並行モデルと呼びます。RowSet
オブジェクト内で変更されたデータがデータ・ソース内でも変更されている場合は、競合が存在します。オプティミスティック並行モデルを使用するということは、競合が存在する場合、データ・ソースまたはRowSet
オブジェクトへの変更が失われるということを意味します。
これに対して、高グレードの同期モデルをペシミスティック(悲観的)並行モデルと呼びます。このモデルでは、他のユーザーがデータ・ソースにアクセスして変更を加える可能性があるという想定のもとに同期処理が行われます。ペシミスティック並行モデルでは、競合の発生を抑えるため、様々なロック・レベルが設定されます。
最低レベルの同期では、RowSet
オブジェクトへの全変更内容が、単純に配下のデータ・ソースに書き込まれます。ライターは競合のチェックを行いません。競合が存在し、データ・ソースの値が上書きされた場合、その他のユーザーによるデータ・ソースの変更は失われます。
RIXMLProvider
実装は、最低レベルの同期を使用し、RowSet
の変更を単純にデータ・ソースに書き込みます。これは、通常、XMLデータ・ソースが、データの整合性を確保するためのトランザクション技術をサポートしていないからです。しかし、XMLベースの同期を可能にする手段を提供しようとしている標準化グループも存在します。詳細については、次を参照してください。
http://www.syncml.org
1つ上のレベルでは、ライターは競合が存在するかどうかをチェックし、存在する場合はデータ・ソースに何も書き込みません。この同期レベルには、RowSet
オブジェクトがデータを取得したあと別のユーザーがデータ・ソース内の対応するデータに変更を加えた場合、RowSet
オブジェクトの変更が失われるという問題があります。RIOptimisticProvider
実装は、この同期レベルを使用します。
最高レベルの同期(ペシミスティック並行モデルの同期)では、ライターは、競合を避けるためにロックを設定します。ロックの設定といっても、単一の行のロックから、テーブルまたはデータ・ソース全体のロックまで、さまざまなレベルがあります。したがって、同期レベルは、複数のユーザーによるデータ・ソースへの並行アクセスに重点を置くかと、ライターがRowSet
オブジェクト内のデータとデータ・ソースを同期させておくことに重点を置くかとのトレードオフになります。
反対に、ライターの機能を有効にすれば、同時アクセス機能は無効になります。未接続のすべてのRowSet
オブジェクト(CachedRowSet
、FilteredRowSet
、JoinRowSet
、およびWebRowSet
オブジェクト)は、SyncFactory
メカニズムからSyncProvider
オブジェクトを取得する必要があります。
リファレンス実装(RI)は、次の2つの同期プロバイダを提供します。
SyncFactory
インスタンスから未接続のRowSet
オブジェクトに提供されるデフォルトのプロバイダ。RowSet
オブジェクトとデータ・ソースの同期をとる前に、競合が存在するかどうかのチェックを行います。競合が存在する場合は、何も行いません。つまり、RowSet
オブジェクトの変更は、データ・ソースでは保持されません。
WebRowSet
オブジェクト、すなわちXML形式で読み取りまたは書込み可能な行セットで使用できる同期プロバイダ。RIXMLProvider
実装は競合のチェックを一切行わず、WebRowSet
オブジェクトの更新データを配下のデータ・ソースに単純に書き込みます。WebRowSet
オブジェクトは、XMLデータの処理時に、このプロバイダを使用します。
SyncProvider
実装は、リファレンス実装にバンドルされているため、RowSet
実装はこれらの実装をいつでも利用できます。SyncProvider
実装は、SyncFactory
シングルトンに登録されると、利用可能な状態になります。RowSet
オブジェクトからプロバイダ(コンストラクタ内に指定、またはCachedRowSet
のsetSyncProvider
メソッドの引数として指定)の要求を受け取ると、SyncFactory
シングルトンは、要求されたプロバイダが登録されているかどうかを確認します。登録されている場合は、SyncFactory
はそのインスタンスを作成し、要求元のRowSet
オブジェクトに渡します。指定されたSyncProvider
実装が登録されていない場合は、SyncFactory
シングルトンはSyncFactoryException
オブジェクトをスローします。プロバイダが指定されていない場合は、SyncFactory
はデフォルト・プロバイダ実装RIOptimisticProvider
を作成し、要求元のRowSet
オブジェクトに渡します。
WebRowSet
オブジェクトのコンストラクタ内にプロバイダが指定されていない場合、SyncFactory
は、RIOptimisticProvider
のインスタンスを渡します。ただし、実装により、WebRowSet
のコンストラクタがプロバイダとしてRIXMLProvider
を設定する場合、RowSet
オブジェクトの読み取りおよび書込みはXML形式で行われます。
詳細については、SyncProviderクラス仕様を参照してください。
ベンダーは、SyncProvider実装と任意の同期レベルを開発し、RowSet
オブジェクトに同期メカニズムを選択させることができます。また、[email protected]
でOracle社に実装の完全指定クラス名を登録することにより、その実装を公開することもできます。この処理の詳細については、次で説明します。
サービス・プロバイダ・インタフェースは、
2.2
未接続の
プロパティ・ファイル内にシステム・プロパティやプロパティを指定する方法、JNDIコンテキストを構成する方法の詳細については、
2.3 SyncFactoryプロバイダ・インスタンス生成ポリシー
プロバイダが正常に登録されていれば、
これらのポリシーの詳細については、
さらに、
3.2 グレード
JSR 114には、
3.3 ロック
JSR 114には、
これらの定数は、グレード定数を補完する定数であるとみなすべきです。ほとんどのグレードのデフォルト設定は、
3.4 更新可能ビュー
3.5
次に、リファレンス実装CachedRowSetImplがsetSyncProviderメソッドを呼び出すことによって現在のSyncProviderオブジェクトを再構成する例を示します。
その後、
詳細については、2.0 サービス・プロバイダ・インタフェース・アーキテクチャ
2.1 概要
SyncProvider
実装を登録したあと、必要なときに生成することができる、プラグイン可能なメカニズムを提供します。SyncFactory
の遅延参照メカニズムは、未接続のRowSet
オブジェクトから要求があるまでインスタンスの生成を遅らせることにより、リソースの無駄な消費を制限します。SyncFactory
クラスは、特定のSyncProvider
実装によって提供可能なロギング・オプションとストリームを構成するための標準APIも提供します。
SyncFactory
への登録
RowSet
オブジェクトがサード・パーティのSyncProvider
実装を取得し、そのjavax.sql.RowSetReader
実装とjavax.sql.RowSetWriter
実装を使用できるようにするには、この実装をSyncFactory
に登録する必要があります。すべてのSyncProvider
実装は、次の登録メカニズムを利用できます。
SyncProvider
オブジェクトを追加できる。
SyncFactory
に渡す必要がある。
SyncFactory
クラスの説明を参照してください。
SyncFactory
は要求されたSyncProvider
オブジェクトを生成します。未接続のRowSet
オブジェクトが特定のSyncProvider
実装で初期化されたとき、またはその他のSyncProvider
オブジェクトで実行時に再構成されたときは、次のポリシーが施行されます。
SyncProvider
オブジェクトが指定され、SyncFactory
にプロバイダの参照が含まれない場合、SyncFactoryException
がスローされる。
SyncProvider
オブジェクトが指定され、SyncFactory
にプロバイダの参照が含まれる場合、要求されたプロバイダが提供される。
SyncProvider
オブジェクトが指定されていない場合、リファレンス実装プロバイダRIOptimisticProvider
が提供される。
SyncFactory
クラスの説明を参照してください。
3.0 SyncProvider実装ガイド
3.1 要件
SyncFactory
に完全にプラグイン可能なSyncProvider
準拠実装は、すべての抽象メソッドを拡張し、SyncProvider
クラスに実装する必要があります。個々の実装は、SyncProvider
クラス定義内のグレード、ロック、更新可能ビューの機能を確定する必要があります。1つ以上のSyncProvider
記述基準がサポートされている必要があります。ベンダー実装は、グレード、ロック、更新可能ビューの機能の範囲を示すことを求められます。
SyncProvider
命名規則に準拠する必要があります。この命名規則の詳細については、SyncProvider
クラスの説明を参照してください。
SyncProvider
オブジェクトから未接続のRowSet
オブジェクトに提供される同期の品質を示す、一連のグレードが定義されています。これらのグレードは、サービス品質の低い順に一覧されます。
SyncProvider
実装は、RowSet
オブジェクト内の変更済みデータを配下のデータ・ソースに上書きするのみ。元の値と現在の値を比較して競合があるかどうかを確認する処理は行われない。RIXMLProvider
は、このグレードで実装されている。
SyncProvider
実装は、前回の同期から今回の同期までに変更された行内に競合がないかチェックを行う。もともとのデータ・ソースに変更が加えられたあと、その内容が未接続のRowSet
オブジェクトに反映されることはない。競合が存在しない場合、RowSet
オブジェクト内の変更はデータ・ソースに書き込まれる。競合が存在する場合、変更内容は書き込まれない。RIOptimisticProvider
実装は、このグレードを使用する。
SyncProvider
実装は、未接続のRowSet
オブジェクト内のすべての行を、未変更のものも含めてチェックする。これにより、同期が正常に完了したとき、配下のデータ・ソース内のすべての行の変更が未接続のRowSet
オブジェクトに反映される。
SyncProvider
実装は、RowSet
オブジェクト内の行が変更されたとき、データ・ソース内の同じデータが別のプロセスによって変更されることがないように、もともとのデータ・ソース内の行をロックする。
SyncProvider
実装は、RowSet
オブジェクトの移植に使用された元のクエリーの影響を受けるビューとテーブル全体、またはそのいずれかをロックする。
RowSet
オブジェクトの配下のデータ・ソースにロックが適用されているかどうか、適用されている場合はどの構造体に適用されているかを示す定数のセットが定義されています。これらのロックは、データ・ソースからRowSet
オブジェクトが切断されるまで、データ・ソース上に保持されます。
RowSet
オブジェクトをデータ・ソースから切断するときデータ・ソースのロックも破棄することを要求します。グレードGRADE_LOCK_WHEN_MODIFIED
およびGRADE_LOCK_WHEN_LOADED
では、未接続のRowSet
オブジェクトでロックの段階を細かく制御できます。
RowSet
オブジェクトの管理下にあるものを除くすべてのSyncProvider
実装のデフォルトのロック設定です。
RowSet
オブジェクトの移植に使用された元のSQLクエリーの影響を受ける行にのみ保持される。
RowSet
オブジェクトの移植に使用されたクエリーの影響を受けるすべてのテーブル上で保持される。
RowSet
オブジェクトによって使用されるデータ・ソース全体で保持される。
RowSet
オブジェクトには、SQL VIEW
のデータを移植できます。次に、SyncProvider
オブジェクトが、VIEW
の派生元のテーブル(複数可)内のデータを更新できるかどうかを示す定数を示します。
SyncProvider
実装が、RowSet
オブジェクトを移植するために使用されたSQL VIEW
の派生元のテーブル(複数可)への同期をサポートすることを示す。
SyncProvider
実装が、RowSet
オブジェクトを移植するために使用されたSQL VIEW
の派生元のテーブル(複数可)への同期をサポートしないことを示す。
SyncProvider
のグレード機能とロック機能の使用方法
CachedRowSetImpl crs = new CachedRowSetImpl();
crs.setSyncProvider("com.foo.bar.HASyncProvider");
アプリケーションは、未接続のRowSet
オブジェクトによって現在使用されているSyncProviderオブジェクトを取得できます。また、プロバイダの実装に使用された同期のグレードと現在使用されているロックの段階も取得できます。アプリケーションの柔軟性を利用して、使用するロックの段階を設定することにより、同期の成功の確率を高めることができます。これらのオペレーションについては、次のコードの抜粋を参照してください。
SyncProvider sync = crs.getSyncProvider();
switch (sync.getProviderGrade()) {
case: SyncProvider.GRADE_CHECK_ALL_AT_COMMIT
//A high grade of optimistic synchronization
break;
case: SyncProvider.GRADE_CHECK_MODIFIED_AT_COMMIT
//A low grade of optimistic synchronization
break;
case: SyncProvider.GRADE_LOCK_WHEN_LOADED
// A pessimistic synchronization grade
break;
case: SyncProvider.GRADE_LOCK_WHEN_MODIFIED
// A pessimistic synchronization grade
break;
case: SyncProvider.GRADE_NONE
// No synchronization with the originating data source provided
break;
}
switch (sync.getDataSourcLock() {
case: SyncProvider.DATASOURCE_DB_LOCK
// A lock is placed on the entire datasource that is used by the
//
RowSet
object
break;
case: SyncProvider.DATASOURCE_NO_LOCK
// No locks remain on the originating data source.
break;
case: SyncProvider.DATASOURCE_ROW_LOCK
// A lock is placed on the rows that are touched by the original
// SQL statement used to populate
// the RowSet object that is using the SyncProvider
break;
case: DATASOURCE_TABLE_LOCK
// A lock is placed on all tables that are touched by the original
// SQL statement used to populated
// the RowSet object that is using the SyncProvider
break;
SyncFactory
クラスのstaticユーティリティ・メソッドを使って、現在SyncFactory
に登録されているSyncProvider
実装の一覧を確認することもできます。
Enumeration e = SyncFactory.getRegisteredProviders();
4.0 同期競合の解決
アプリケーションは、SyncResolver
インタフェースを利用して、競合が発生したときの手動での対処法を決定できます。CachedRowSet
のacceptChanges
メソッドが終了し、競合の存在が確認された場合、このメソッドはSyncProviderException
オブジェクトをスローします。アプリケーションは例外をキャッチし、SyncProviderException.getSyncResolver()
メソッド呼出しによってSyncResolver
オブジェクトを取得させることができます。
SyncResolver
オブジェクトは、SyncResolver
インタフェースを実装している特殊なCachedRowSet
またはJdbcRowSet
オブジェクトであり、1行ずつ競合のチェックを行います。同期されるRowSet
オブジェクトの複製になっていて、競合の原因となっているデータ・ソースのデータのみを格納しています。その他のすべての列値はnull
に設定されます。SyncResolver
オブジェクトは、競合している値から別の競合している値へ移動できるメソッド、nextConflict
およびpreviousConflict
を提供しています。
SyncResolver
インタフェースは、次の処理を行うメソッドも提供します。
RowSet
オブジェクトのデータを変更する必要がある場合その適切な値の設定
CachedRowSet
のacceptChanges
iメソッドは、呼び出されると、RowSet
オブジェクトのSyncProvider
オブジェクトを委譲します。このSyncProvider
オブジェクトから提供されるライターの実装方法によって、競合のチェック・レベル(グレード)が決定されます。競合のチェックがすべて完了し、実際に競合が検出された場合、acceptChanges
メソッドはSyncProviderException
オブジェクトをスローします。アプリケーションは例外をキャッチし、この例外を使ってSyncResolver
オブジェクトを取得することができます。
SyncResolver
メソッドを使って、各競合の情報を取得し、対処方法を決定します。アプリケーション・ロジックまたはユーザーにより、RowSet
オブジェクト内の値を持続させる必要があるという判断が下された場合、アプリケーションまたはユーザーは、この値でデータ・ソース値を上書きできます。
SyncResolver
インタフェースのコメントを参照してください。5.0 関連仕様
6.0 関連項目
バグまたは機能を送信
詳細なAPIリファレンスおよび開発者ドキュメントについては、Java SEのドキュメントを参照してください。そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright© 1993, 2014, Oracle and/or its affiliates. All rights reserved.