|
JavaTM 2 Platform Standard Ed. 5.0 |
|||||||||
前のパッケージ 次のパッケージ | フレームあり フレームなし |
参照先:
説明
インタフェースの概要 | |
---|---|
SyncResolver | アプリケーションが、手動の意志決定ツリーを使って同期競合が発生したときの対処方法を決定できるようにするフレームワークを定義します。 |
TransactionalWriter | より精密なトランザクション制御ができるように、標準 SyncProvider 抽象クラスの拡張を促進する特別なインタ
フェースです。 |
XmlReader | SyncProvider 抽象クラスの拡張を促進する、XML 指向の同期プロバイダ向けの特別なインタフェースです。 |
XmlWriter | SyncProvider 抽象クラスの拡張を促進する、XML 指向の同期プロバイダ向けの特別なインタフェースです。 |
クラスの概要 | |
---|---|
SyncFactory | 未接続の RowSet オブジェクトによって使用される SyncProvider インスタン
スを生成するサービスプロバイダインタフェース (Service Provider Interface、SPI) 機構です。 |
SyncProvider | 未接続の RowSet オブジェクトの読み取り/書き込み機能を提供する同期機構です。 |
例外の概要 | |
---|---|
SyncFactoryException | SyncFactory 機構のエラーを示します。 |
SyncProviderException | SyncProvider 機構で発生したエラーを示します。 |
サードパーティのベンダーが同期プロバイダの実装で使用しなければならない標準クラスおよびインタフェースです。これらのクラスおよびインタフェースをまとめて、「サービスプロバイダインタフェース (Service Provider Interface、SPI)」と呼びます。使用可能な 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
シングルトンは、要求されたプロバイダが登録されているかどうかを確認します。登録されている場合は、
そのインスタンスを作成し、要求元の RowSet
オブジェクトに渡します。指定された SyncProvider
実装が登録されていない場合は、SyncFactory
シングルトンは SyncFactoryException
オブジェクトをスローします。プロバイダが指定されていない場合は、デフォルトプロバイダ実装 RIOptimisticProvider
を作成し、要求元の RowSet
オブジェクトに渡します。
WebRowSet
オブジェクトのコンストラクタ内にプロバイダが指定されていない場合、SyncFactory
は、RIOptimisticProvider
のインスタンスを渡します。ただし、実装により、WebRowSet
のコンストラクタがプロバイダとして RIXMLProvider
を設定する場合、RowSet
オブジェクトの読み取りおよび書き込みは XML 形式で行われます。
詳細については、SyncProvider クラス仕様を参照してください。
ベンダーは、SyncProvider 実装と任意の同期レベルを開発し、RowSet
オブジェクトに同期機構を選択させることができます。また、jdbc@sun.com
で Sun Microsystems に実装の完全修飾クラス名を登録することにより、その実装を公開することもできます。この処理の詳細については、以下で説明します。
サービスプロバイダインタフェースは、 2.2 未接続の プロパティファイル内にシステムプロパティやプロパティを指定する方法、JNDI コンテキストを構成する方法の詳細については、 2.3 SyncFactory プロバイダインスタンス生成ポリシー プロバイダが正常に登録されていれば、 これらのポリシーの詳細については、 さらに、 3.2 グレード JSR 114 には、 3.3 ロック JSR 114 には、
これらの定数は、グレード定数を補完する定数です。ほとんどのグレードのデフォルト設定は、 3.4 更新可能ビュー 3.5 以下に、リファレンス実装 CachedRowSetImpl が setSyncProvider メソッドを呼び出すことによって現在の SyncProvider オブジェクトを構成する例を示します。
その後、
詳細については、
Copyright 2004 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Documentation Redistribution Policy も参照してください。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
メソッドは、呼び出されると、RowSet
オブジェクトの SyncProvider
オブジェクトを委譲します。この SyncProvider
オブジェクトから提供されるライターの実装方法は、競合のチェックレベル (グレード) によって決定されます。競合のチェックがすべて完了し、実際に競合が検出された場合、acceptChanges
メソッドは SyncProviderException
オブジェクトをスローします。アプリケーションは例外をキャッチし、この例外を使って SyncResolver
オブジェクトを取得することができます。
SyncResolver
メソッドを使って、各競合の情報を取得し、対処方法を決定します。アプリケーションロジックまたはユーザにより、RowSet
オブジェクト内の値を持続させる必要があるという判断が下された場合、アプリケーションまたはユーザは、この値でデータソース値を上書きできます。
SyncResolver
インタフェースのコメントを参照してください。
5.0 関連仕様
6.0 関連項目
概要
パッケージ
クラス
使用
階層ツリー
非推奨 API
索引
ヘルプ
JavaTM 2 Platform
Standard Ed. 5.0
前のパッケージ
次のパッケージ
フレームあり
フレームなし
バグの報告と機能のリクエスト
さらに詳しい API リファレンスおよび開発者ドキュメントについては、Java 2 SDK SE 開発者用ドキュメントを参照してください。開発者向けの詳細な解説、概念の概要、用語の定義、バグの回避策、およびコード実例が含まれています。