JavaTM Platform
Standard Ed. 6

パッケージ javax.sql.rowset.spi

サードパーティーのベンダーが同期プロバイダの実装で使用しなければならない標準クラスおよびインタフェースです。

参照先:
          説明

インタフェースの概要
SyncResolver アプリケーションが、手動の意志決定ツリーを使って同期競合が発生したときの対処方法を決定できるようにするフレームワークを定義します。
TransactionalWriter より精密なトランザクション制御ができるように、標準 SyncProvider abstract クラスの拡張を促進する特別なインタフェースです。
XmlReader SyncProvider abstract クラスの拡張を促進する、XML 指向の同期プロバイダ向けの特別なインタフェースです。
XmlWriter SyncProvider abstract クラスの拡張を促進する、XML 指向の同期プロバイダ向けの特別なインタフェースです。
 

クラスの概要
SyncFactory 未接続の RowSet オブジェクトによって使用される SyncProvider インスタンスを生成するサービスプロバイダインタフェース (Service Provider Interface、SPI) 機構です。
SyncProvider 未接続の RowSet オブジェクトの読み取り/書き込み機能を提供する同期機構です。
 

例外の概要
SyncFactoryException SyncFactory 機構のエラーを示します。
SyncProviderException SyncProvider 機構で発生したエラーを示します。
 

パッケージ javax.sql.rowset.spi の説明

サードパーティーのベンダーが同期プロバイダの実装で使用しなければならない標準クラスおよびインタフェースです。これらのクラスおよびインタフェースをまとめて、「サービスプロバイダインタフェース (Service Provider Interface、SPI)」と呼びます。使用可能な SyncProvider 実装の一覧が記載された JDBC Web ページにベンダー固有の実装を追加して、開発者に実装を公開したい場合は、jdbc@sun.com まで電子メールにてご連絡ください。RowSet オブジェクトで実装を使用できるようにするには、その実装を SyncFactory シングルトンに登録する必要があります。登録手順と命名規則の詳しい説明については、SyncProvider のクラスコメントを参照してください。

目次

1.0 パッケージの仕様

javax.sql.rowset.spi パッケージは、次のクラスおよびインタフェースで構成されています。

この SPI には、javax.sql パッケージ内の次のインタフェースも含まれています。

SyncProvider 実装は、未接続の RowSet オブジェクトがデータを読み込み、変更を加えたあと配下のデータソースに再度書き込めるようにする手段を提供します。リーダーオブジェクト (RowSetReader または XMLReader) は、CachedRowSetexecute または populate メソッドが呼び出されると、RowSet オブジェクトにデータを読み込みます。ライターオブジェクト (RowSetWriter または XMLWriter) は、CachedRowSetacceptChanges メソッドが呼び出されると、配下のデータソースに変更されたデータを書き込みます。

RowSet オブジェクトの変更内容をデータソースに書き込む処理を「同期」と呼びます。RowSet オブジェクトのライターが使用する同期のレベルは、RowSet オブジェクトの SyncProvider 実装によって決定されます。同期のさまざまなレベルのことを「グレード」と呼びます。

低グレードの同期は、競合がまったく存在しないか、存在したとしてもわずかであるというオプティミスティック (楽観的) な想定のもとに行われます。 この同期モデルを「オプティミスティック並行モデル」と呼びます。RowSet オブジェクト内で変更されたデータがデータソース内でも変更されている場合は、競合が存在します。オプティミスティック並行モデルを使用するということは、競合が存在する場合、データソースまたは RowSet オブジェクトへの変更が失われるということを意味します。

これに対して、高グレードの同期モデルを「ペシミスティック (悲観的) 並行モデル」と呼びます。 このモデルでは、ほかのユーザーがデータソースにアクセスして変更を加える可能性があるという想定のもとに同期処理が行われます。ペシミスティック並行モデルでは、競合の発生を抑えるため、さまざまなロックレベルが設定されます。

最低レベルの同期では、RowSet オブジェクトへの全変更内容が、単純に配下のデータソースに書き込まれます。ライターは競合のチェックを行いません。競合が存在し、データソースの値が上書きされた場合、その他のユーザーによるデータソースの変更は失われます。

RIXMLProvider 実装は、最低レベルの同期を使用し、RowSet の変更を単純にデータソースに書き込みます。 これは、通常、XML データソースが、データの整合性を確保するためのトランザクション技術をサポートしていないからです。しかし、XML ベースの同期を可能にする手段を提供しようとしている標準化グループも存在します。詳細については、以下を参照してください。

     http://www.syncml.org

1 つ上のレベルでは、ライターは競合が存在するかどうかをチェックし、存在する場合はデータソースに何も書き込みません。この同期レベルには、RowSet オブジェクトがデータを取得したあと別のユーザーがデータソース内の対応するデータに変更を加えた場合、RowSet オブジェクトの変更が失われるという問題があります。RIOptimisticProvider 実装は、この同期レベルを使用します。

最高レベルの同期 (ペシミスティック並行モデルの同期) では、ライターは、競合を避けるためにロックを設定します。ロックの設定といっても、単一の行のロックから、テーブルまたはデータソース全体のロックまで、さまざまなレベルがあります。したがって、同期レベルは、複数のユーザーによるデータソースへの同時アクセスに重点を置くかと、ライターが RowSet オブジェクト内のデータとデータソースを同期させておくことに重点を置くかとのトレードオフになります。

反対に、ライターの機能を有効にすれば、同時アクセス機能は無効になります。 未接続のすべての RowSet オブジェクト (CachedRowSetFilteredRowSetJoinRowSet、および WebRowSet オブジェクト) は、SyncFactory 機構から SyncProvider オブジェクトを取得する必要があります。

リファレンス実装 (RI) は、次の 2 つの同期プロバイダを提供します。

これらの SyncProvider 実装は、リファレンス実装にバンドルされているため、RowSet 実装はこれらの実装をいつでも利用できます。SyncProvider実装は、SyncFactory シングルトンに登録されると、利用可能な状態になります。RowSet オブジェクトからプロバイダ (コンストラクタ内に指定、または CachedRowSetsetSyncProviderメソッドの引数として指定) の要求を受け取ると、SyncFactory シングルトンは、要求されたプロバイダが登録されているかどうかを確認します。登録されている場合は、そのインスタンスを作成し、要求元の RowSet オブジェクトに渡します。指定された SyncProvider実装が登録されていない場合は、SyncFactory シングルトンは SyncFactoryException オブジェクトをスローします。プロバイダが指定されていない場合は、デフォルトプロバイダ実装 RIOptimisticProvider を作成し、要求元の RowSet オブジェクトに渡します。

WebRowSet オブジェクトのコンストラクタ内にプロバイダが指定されていない場合、SyncFactory は、RIOptimisticProvider のインスタンスを渡します。ただし、実装により、WebRowSet のコンストラクタがプロバイダとして RIXMLProvider を設定する場合、RowSet オブジェクトの読み取りおよび書き込みは XML 形式で行われます。

詳細については、SyncProvider クラス仕様を参照してください。

ベンダーは、SyncProvider 実装と任意の同期レベルを開発し、RowSet オブジェクトに同期機構を選択させることができます。また、jdbc@sun.com で Sun Microsystems に実装の完全修飾クラス名を登録することにより、その実装を公開することもできます。この処理の詳細については、以下で説明します。

2.0 サービスプロバイダインタフェースアーキテクチャー

  • 3.0 SyncProvider 実装ガイド

    4.0 同期競合の解決

    アプリケーションは、SyncResolver インタフェースを利用して、競合が発生したときの手動での対処法を決定できます。CachedRowSetacceptChanges メソッドが終了し、競合の存在が確認された場合、このメソッドは SyncProviderException オブジェクトをスローします。アプリケーションは例外をキャッチし、SyncProviderException.getSyncResolver() メソッド呼び出しによって SyncResolver オブジェクトを取得させることができます。

    SyncResolver オブジェクトは、SyncResolver インタフェースを実装している特殊な CachedRowSet または JdbcRowSet オブジェクトであり、1 行ずつ競合のチェックを行います。同期される RowSet オブジェクトの複製になっていて、競合の原因となっているデータソースのデータのみを格納しています。その他のすべての列値は null に設定されます。SyncResolver オブジェクトは、競合している値から別の競合している値へ移動できるメソッド、nextConflict および previousConflict を提供しています。

    SyncResolver インタフェースは、以下の処理を行うメソッドも提供します。

    CachedRowSetacceptChanges メソッドは、呼び出されると、RowSet オブジェクトの SyncProvider オブジェクトを委譲します。この SyncProvider オブジェクトから提供されるライターの実装方法によって、競合のチェックレベル (グレード) が決定されます。競合のチェックがすべて完了し、実際に競合が検出された場合、acceptChanges メソッドは SyncProviderException オブジェクトをスローします。アプリケーションは例外をキャッチし、この例外を使って SyncResolver オブジェクトを取得することができます。

    その後、SyncResolver メソッドを使って、各競合の情報を取得し、対処方法を決定します。 アプリケーションロジックまたはユーザーにより、RowSet オブジェクト内の値を持続させる必要があるという判断が下された場合、アプリケーションまたはユーザーは、この値でデータソース値を上書きできます。

    詳細については、SyncResolver インタフェースのコメントを参照してください。

    5.0 関連仕様

    6.0 関連項目


    JavaTM Platform
    Standard Ed. 6

    バグの報告と機能のリクエスト
    さらに詳しい API リファレンスおよび開発者ドキュメントについては、Java SE 開発者用ドキュメントを参照してください。開発者向けの詳細な解説、概念の概要、用語の定義、バグの回避策、およびコード実例が含まれています。

    Copyright 2009 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Documentation Redistribution Policy も参照してください。