インタフェース | 説明 |
---|---|
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 ページにベンダー固有の実装を追加して、開発者に実装を公開したい場合は、jdbc@sun.com
まで電子メールにてご連絡ください。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
オブジェクトに同期メカニズムを選択させることができます。また、jdbc@sun.com
でオラクル社に実装の完全指定クラス名を登録することにより、その実装を公開することもできます。この処理の詳細については、次で説明します。
サービスプロバイダインタフェースは、
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, 2013, Oracle and/or its affiliates. All rights reserved.