モジュール java.sql.rowset
パッケージ javax.sql.rowset

インタフェースCachedRowSet

すべてのスーパー・インタフェース:
AutoCloseable, Joinable, ResultSet, RowSet, Wrapper
既知のすべてのサブインタフェース:
FilteredRowSet, JoinRowSet, WebRowSet

public interface CachedRowSet extends RowSet, Joinable
CachedRowSetのすべての標準実装が実装しなければならないインタフェースです。

Oracle Corporationから提供されたCachedRowSetインタフェースのリファレンス実装は、標準実装です。 開発者はこれをそのまま使用することも、拡張することも、またはこのインタフェースの実装を独自に作成することもできます。

CachedRowSetオブジェクトは、メモリー内に行をキャッシュする、データ行のコンテナであり、常にそのデータ・ソースに接続していなくても処理を実行できます。 さらに、これはJavaBeansコンポーネントであり、スクロール可能、更新可能および直列化可能です。 CachedRowSetオブジェクトには、通常、結果セットの行が格納されますが、スプレッドシートなど、表形式のあらゆるファイルの行を格納することもできます。 リファレンス実装は、ResultSetオブジェクトからのデータの取得しかサポートしませんが、開発者は、その他の表形式のデータ・ソースにアクセスできるように、SyncProvider実装を拡張することができます。

アプリケーションは、CachedRowSetオブジェクト内のデータを変更できます。これらの変更は、データ・ソースにも反映されます。

CachedRowSetオブジェクトは未接続の行セットです。つまり、データ・ソースとの接続を少ししか利用しません。 データ・ソースに接続するのは、データを読み取って自身に行を読み込むときと、配下のデータ・ソースに変更内容を反映するときだけです。 それ以外のときは、CachedRowSetオブジェクトはデータの変更中も含めて、データ・ソースから切断されています。 RowSetオブジェクトは、このように、データ・ソースから切断されているためムダが少なく、その他のコンポーネントに渡しやすくなっています。 たとえば、未接続のRowSetオブジェクトを直列化し、回線経由でPDAなどのthinクライアントに渡すことができます。

1.0 CachedRowSetオブジェクトの作成

次のコードは、リファレンス実装(RI)のCachedRowSetのデフォルト・コンストラクタを使用して、デフォルトのCachedRowSetオブジェクトを作成します。
     CachedRowSetImpl crs = new CachedRowSetImpl();
 
この新しいCachedRowSetオブジェクトは、そのプロパティをBaseRowSetオブジェクトのデフォルトのプロパティに設定します。さらに、同期プロバイダとしてRIOptimisticProviderオブジェクトを持ちます。 RIに含まれる2つのSyncProvider実装のうちの1つ、RIOptimisticProviderは、同期プロバイダが指定されていない場合にSyncFactoryシングルトンから提供されるデフォルトのプロバイダです。

SyncProviderオブジェクトは、CachedRowSetオブジェクトと、データ・ソースからデータを読み取って自身にデータを読み込むリーダー(RowSetReaderオブジェクト)を提供します。 リーダーを実装することにより、ResultSetオブジェクトや表形式のファイルからデータを読み取ることができます。 SyncProviderオブジェクトは、ライター(RowSetWriterオブジェクト)も提供します。ライターは、配下のデータ・ソース内のデータから切断されている間にCachedRowSetオブジェクトのデータに加えられた変更内容を同期します。

ライターを実装することにより、さまざまなレベルで、競合のチェックや予防を行うことができます。 (競合は、行セットに値を読み込んだあとでデータ・ソース内の値が変更された場合に発生します。) RIOptimisticProvider実装は、競合がほとんどないか、まったくないものとして、ロックを一切設定しません。 この実装は、競合がない場合にのみ、CachedRowSetオブジェクトの値でデータ・ソースを更新します。 変更されたデータをデータ・ソースへ書き込む目的でのみ実装されるライターもあります。この実装は、競合のチェックを行わないか、そのまったく逆で、データ・ソース内のデータの変更を十分防げるだけのロックを設定することによって行われます。 また、そのほぼ中間のライター実装もあります。

CachedRowSetオブジェクトは、SyncFactoryシングルトンに登録された任意のSyncProvider実装を使用できます。 アプリケーションは、次のコードを呼び出すことにより、登録されているSyncProvider実装を検出できます。

      java.util.Enumeration providers = SyncFactory.getRegisteredProviders();
 

CachedRowSetオブジェクトで使用するSyncProviderオブジェクトを指定する方法は、次の2とおりです。

  • コンストラクタに実装名を提供する
    次のコードは、デフォルト値(ただしSyncProviderを指定)で初期化されるCachedRowSetオブジェクトcrs2を作成します。
              CachedRowSetImpl crs2 = new CachedRowSetImpl(
                                     "com.fred.providers.HighAvailabilityProvider");
         
  • CachedRowSetメソッドsetSyncProviderを使ってSyncProviderを設定する
    次のコードは、crsSyncProviderオブジェクト(デフォルトのコンストラクタで作成されたCachedRowSetオブジェクト)をリセットします。
               crs.setSyncProvider("com.fred.providers.HighAvailabilityProvider");
          
詳細は、SyncFactoryおよびSyncProviderのコメントを参照してください。

2.0 CachedRowSetオブジェクトからのデータの取得

データは、ResultSetインタフェースから継承された取得メソッドを使用して、CachedRowSetオブジェクトから取得されます。 次の例は、crsCachedRowSetオブジェクトとして行の反復処理を行い、各行から列の値を取得する方法を示します。 最初の例では、列番号を取る取得メソッドを使用します。2番目の例では、列名を取る取得メソッドを使用します。 列番号は通常、RowSetオブジェクトのコマンドがSELECT * FROM TABLENAMEの形式になる場合に使用されます。列名は、列名を指定するコマンドでよく使用されます。
    while (crs.next()) {
        String name = crs.getString(1);
        int id = crs.getInt(2);
        Clob comment = crs.getClob(3);
        short dept = crs.getShort(4);
        System.out.println(name + "  " + id + "  " + comment + "  " + dept);
    }
 
    while (crs.next()) {
        String name = crs.getString("NAME");
        int id = crs.getInt("ID");
        Clob comment = crs.getClob("COM");
        short dept = crs.getShort("DEPT");
        System.out.println(name + "  " + id + "  " + comment + "  " + dept);
    }
 

2.1 RowSetMetaDataの取得

アプリケーションは、RowSetMetaDataオブジェクト上にResultSetMetaDataメソッドとRowSetMetaDataメソッドを呼び出すことにより、CachedRowSetオブジェクト内の列に関する情報を取得できます。 次のコードの抜粋では、crsCachedRowSetオブジェクトとして、この処理について説明します。 1行目では、crs内の列に関する情報を持つRowSetMetaDataオブジェクトを作成します。 ResultSetインタフェースから継承されたgetMetaDataメソッドは、ResultSetMetaDataオブジェクトを返します。返されたオブジェクトは、変数rsmdに割り当てられる前にRowSetMetaDataオブジェクトにキャストされます。 2行目では、jrsの列数を確認します。3行目では、jrsの2番目の列に格納された値のJDBC型を取得します。
     RowSetMetaData rsmd = (RowSetMetaData)crs.getMetaData();
     int count = rsmd.getColumnCount();
     int type = rsmd.getColumnType(2);
 
RowSetMetaDataインタフェースは、次の2つの点で、ResultSetMetaDataインタフェースとは異なっています。
  • setterメソッドを含む: RowSetオブジェクトは、別のResultSetオブジェクトのデータを読み込む際、これらのメソッドを内部で使用します。
  • 含まれるgetterメソッドが少なくなっています。ResultSetMetaDataの一部のメソッドはRowSetオブジェクトには適用されません。 たとえば、列の値が書込み可能であるか読取り専用であるかを確認するメソッドは適用されません。これは、RowSetオブジェクトのすべての列は、行セットの更新が可能な場合は書込み可能、行セットの更新ができない場合は読取り専用であるからです。
ノート: RowSetMetaDataオブジェクトを返すためには、実装でjava.sql.ResultSetに定義されたgetMetaData()メソッドをオーバーライドし、RowSetMetaDataオブジェクトを返す必要があります。

3.0 CachedRowSetオブジェクトの更新

CachedRowSetオブジェクトの更新方法はResultSetオブジェクトの更新方法と同様ですが、更新中、行セットはデータ・ソースに接続していないので、配下のデータ・ソースに変更を加える追加ステップが必要になります。 CachedRowSetオブジェクトは、updateRowメソッドかinsertRowメソッドを呼び出したあと、acceptChangesメソッドを呼び出して、更新内容をデータ・ソースに書き込む必要があります。 次の例では、CachedRowSetオブジェクトcrs内の行にカーソルが置かれています。このコードは、現在の行の2つの列の値を更新し、RowSetオブジェクトの配下のデータ・ソースを更新します。
     crs.updateShort(3, 58);
     crs.updateInt(4, 150000);
     crs.updateRow();
     crs.acceptChanges();
 

次の例では、挿入行に移動し、挿入行の上に新しい行を作成して、これを行セットに挿入します。さらに、acceptChangesメソッドを呼び出して、配下のデータ・ソースに新しい行を追加します。 取得メソッドの場合と同様に、更新メソッドでも、列インデックスか列名を使用して処理対象の列を指定できます。

     crs.moveToInsertRow();
     crs.updateString("Name", "Shakespeare");
     crs.updateInt("ID", 10098347);
     crs.updateShort("Age", 58);
     crs.updateInt("Sal", 150000);
     crs.insertRow();
     crs.moveToCurrentRow();
     crs.acceptChanges();
 

ノート: insertRow()メソッドで、CachedRowSetオブジェクトの挿入行の内容を挿入する場所は、実装で定義します。 CachedRowSetインタフェースのリファレンス実装は、現在の行の直後に新しい行を挿入しますが、ほかの任意の箇所にも挿入するように実装できます。

これらの例におけるacceptChangesメソッドの使用方法に注目してください。 このメソッドは、RowSetオブジェクトのライターを内部で呼び出し、データ・ソースに変更を書き込むことにより、CachedRowSetオブジェクト内の変更内容を配下のデータ・ソースへ伝達します。 このために、ライターは、データ・ソースとの接続を確立しなければいけません。 最初の2つのコードの抜粋は、updateRowまたはinsertRowの呼出し後ただちにacceptChangesメソッドを呼び出します。 しかし、複数の行を変更する場合は、updateRowinsertRowの呼出しがすべて完了してからacceptChangesを呼び出す方法のほうが効率がよくなります。 acceptChangesを1回しか呼び出さない場合は、接続を1つ確立するだけで済みます。

4.0 配下のデータ・ソースの更新

acceptChangesメソッドの実行時には、行セットへの変更点を配下のデータ・ソースへ書き込むため、背後でCachedRowSetオブジェクトのライター、RowSetWriterImplオブジェクトが呼び出されます。 このライターが実装されることにより、データ・ソースへの接続が確立され、更新情報が書き込まれます。

ライターは、セクション1の「CachedRowSetオブジェクトの作成」で説明したとおり、SyncProviderインタフェースの実装を介して利用できます。 デフォルトのリファレンス実装プロバイダRIOptimisticProviderは、オプティミスティック並行処理制御メカニズムを利用するため、ライターを実装しています。 つまり、行セットがデータベースから切断されている間、配下のデータベースはロックされず、データ・ソースへデータを書き込む前に競合がないかどうかの確認が行われるだけとなります。 競合がある場合、データ・ソースへは何も書き込まれません。

SyncProviderクラスによって提供されるリーダー/ライターの機能は、プラグイン可能であり、データの取得と更新のカスタマイズに利用できます。 別の並行処理制御メカニズムが必要な場合は、setSyncProviderメソッドを使って、別のSyncProvider実装をプラグインできます。

楽観的同時実行制御ルーチンを使用するために、RIOptimisticProviderは、現在の値と元の値(現在の値の直前にあった値)の両方を維持します。 RowSetオブジェクト内のデータが変更されなかった場合、現在の値と元の値は同一(RowSetオブジェクトが最初に生成されたときの値)になります。 しかし、RowSetオブジェクト内の値が変更された場合、現在の値と元の値は一致しません。この段階では、元の値は初期値のままです。 その後のRowSetオブジェクト内のデータの変更により、元の値と現在の値は一致しなくなりますが、以前現在の値だった値が元の値になります。

元の値を追跡することで、ライターは、RowSetオブジェクトの元の値とデータベース内の値を比較できます。 データベース内の値がRowSetオブジェクトの元の値と一致しない場合、データベース内の値が変更されており、競合が発生していることを意味します。 ライターを使って競合のチェックを行うか、どの程度までチェックを行うか、競合をどのように処理するかは、すべて実装によって異なります。

5.0 リスナーの登録と通知

JavaBeansコンポーネントなので、すべての行セットは、BaseRowSetクラスからリスナーを登録して変更内容を通知するためのメソッドを継承して、JavaBeansイベント・モデルに参与します。 CachedRowSetオブジェクトのリスナーは、行セット内に変更があったかどうかを通知されるコンポーネントです。 たとえば、CachedRowSetオブジェクトにクエリーの結果が含まれ、これらの結果が表や棒グラフとして表示されるとします。表や棒グラフは、行セットのリスナーとして登録されることで、変更内容を反映するよう自身の更新を行うことができます。 表および棒グラフのクラスがリスナーになるには、RowSetListenerインタフェースを実装する必要があります。 その後、これらをCachedRowSetオブジェクトのリスナーのリストに追加します。次のコードを参照してください。
    crs.addRowSetListener(table);
    crs.addRowSetListener(barGraph);
 
カーソルを移動したり、データを変更したりするCachedRowSetメソッドも、登録済みのリスナーに変更を通知します。したがって、crs内に変更があると、tablebarGraphはその通知を受けます。

6.0 thinクライアントへのデータの送信

CachedRowSetオブジェクトは、主に、アプリケーション・コンポーネント間でのデータの受け渡しに利用されます。 CachedRowSetオブジェクトは直列化可能なので、たとえば、サーバー環境で稼動中のエンタープライズJavaBeansコンポーネントによって実行されたクエリーの結果を、Webブラウザで稼動中のクライアントに、ネットワーク経由で送信するために利用することができます。

未接続のCachedRowSetオブジェクトは、同じデータを持つResultSetオブジェクトよりもずっとコンパクトである可能性があります。 このため、特にリソースの制限やセキュリティ上の理由によりJDBCドライバを使用するのが難しいPDAなどのthinクライアントへのデータ送信に最適である可能性があります。 このように、CachedRowSetオブジェクトでは、JDBC APIを完全に実装しなくても行を取得できます。

7.0 スクロールと更新

CachedRowSetオブジェクトには、スクロール機能や更新機能を持たないResultSetオブジェクトにこれらの機能を提供する働きもあります。 DBMSがスクロールと更新の機能をフルサポートしない場合は、CachedRowSetオブジェクトを使用して、JDBCテクノロジを使用可能なドライバの機能を向上させることができます。 スクロール不可能で読み取り専用のResultSetオブジェクトをスクロール可能かつ更新可能にする効果を達成するために、プログラマは、そのResultSetオブジェクト・データで作成されたCachedRowSetオブジェクトを作成するだけで済みます。 具体例については、次のコードの抜粋を参照してください。この例では、stmtStatementオブジェクトを表します。
    ResultSet rs = stmt.executeQuery("SELECT * FROM EMPLOYEES");
    CachedRowSetImpl crs = new CachedRowSetImpl();
    crs.populate(rs);
 

rsオブジェクトの場合と同様に、crsオブジェクトに、表EMPLOYEESのデータが追加されます。 ただし、crsのカーソルは前方、後方または特定の行に移動できるのに対して、rsのカーソルは前方にしか移動できません。 また、crsに更新機能があるのに対して、rsには更新機能はありません。これは、CachedRowSetオブジェクトに、スクロール機能と更新機能がデフォルトで用意されているからです。

つまり、CachedRowSetオブジェクトは、データ・ソースの外部でキャッシュされる未接続の行になります。 サイズが小さく、直列化可能なので、回線経由で簡単に送信できるだけでなく、thinクライアントへのデータ送信にも適しています。 ただし、メモリー内に同時に格納できるデータ量が決まっているため、CachedRowSetオブジェクトのサイズは制限されています。

8.0 汎用データ・アクセスの取得

CachedRowSetクラスには、リレーショナル・データベース以外のソースからデータを取得し、格納できるという利点があります。 行セットのリーダーを実装することにより、任意の表形式のデータ・ソース(スプレッドシート、フラット・ファイルを含む)行セットのデータを読み取り、読込みできます。 CachedRowSetオブジェクトとそのメタデータは、いずれもゼロから作成可能なので、行セットのファクトリとして機能するコンポーネントは、この機能を利用して、非SQLデータ・ソースからデータを含む行セットを作成できます。 しかし、ほとんどの場合、CachedRowSetオブジェクトは、JDBC APIを使ってSQLデータベースから取得したデータを格納します。

9.0 プロパティの設定

どの行セットも必ず一連のプロパティを保持しますが、それらのプロパティは通常、ツールを使用して設定されます。 行セットのプロパティの数と種類は、行セットの機能とデータの取得方法によって異なります。 たとえば、ResultSetオブジェクトからデータを取得する行セットでは、データベース接続に必要なプロパティを設定する必要があります。 行セットがDriverManager機能を使用して接続を作成する場合は、適切なドライバを識別するJDBC URLのプロパティと、ユーザー名とパスワードを指定するプロパティを設定する必要があります。 一方、推奨の方法であるDataSourceオブジェクトを使用して接続を行う行セットでは、JDBC URLのプロパティを設定する必要はありません。 かわりに、データ・ソースの論理名のプロパティ、およびユーザー名とパスワードのプロパティを設定する必要があります。

NOTE: 接続にDataSourceオブジェクトを使用するには、Java Naming and Directory Interface (JNDI) APIを使用するネーミング・サービスにDataSourceオブジェクトが登録されている必要があります。 登録は通常、システム管理者が行います。

行セットにデータベースのデータを読み込むには、コマンド・プロパティを設定する必要があります。 このプロパティは、PreparedStatementオブジェクトを表すクエリーです。これにより、クエリーは、設計時ではなく実行時に設定されるパラメータ・プレースホルダーを持つことができます。 これらのプレースホルダー・パラメータに値を設定するため、行セットは、各データ型の値を設定する設定メソッドを提供します。これらの設定メソッドは、PreparedStatementインタフェースによって提供される設定メソッドとよく似ています。

次のコードの抜粋は、CachedRowSetオブジェクトcrsにコマンド・プロパティを設定する方法を示しています。 ツールを使ってプロパティを設定する場合、このコードを使用します。


    crs.setCommand("SELECT FIRST_NAME, LAST_NAME, ADDRESS FROM CUSTOMERS " +
                   "WHERE CREDIT_LIMIT > ? AND REGION = ?");
  

コマンドのプレースホルダー・パラメータの設定に使用される値は、RowSetオブジェクトのparamsフィールドに、Vectorオブジェクトとして格納されます。 CachedRowSetクラスは、paramsフィールド内の要素を設定する設定メソッドのセットを提供します。 次のコードの抜粋は、先ほどの例で、クエリー内の2つのパラメータを設定する方法を示しています。

    crs.setInt(1, 5000);
    crs.setString(2, "West");
 

paramsフィールドに2つの要素が追加されました。これらはそれぞれ、要素2つ分の長さの配列になります。 最初の要素はパラメータ番号、2番目の要素は設定する値を表します。 この場合、paramsの最初の要素は1, 5000、2番目の要素は2, "West"になります。 アプリケーションは、executeメソッドを呼び出すことにより、このRowSetオブジェクトのリーダーを呼び出します。これにより、そのreadDataメソッドが呼び出されます。 この実装に含まれるreadDataは、params内の値を取得し、これらを使用してコマンドのプレースホルダー・パラメータを設定します。 次のコードの抜粋では、Connectionオブジェクトconの取得後に、リーダーがプレースホルダー・パラメータを設定する手順を示します。


    PreparedStatement pstmt = con.prepareStatement(crs.getCommand());
    reader.decodeParams();
    // decodeParams figures out which setter methods to use and does something
    // like the following:
    //    for (i = 0; i < params.length; i++) {
    //        pstmt.setObject(i + 1, params[i]);
    //    }
 

この時点で、crsのコマンドは、クエリー"SELECT FIRST_NAME, LAST_NAME, ADDRESS FROM CUSTOMERS WHERE CREDIT_LIMIT> 5000 AND REGION = "West"になります。 readDataメソッドは、次のコードでこのコマンドを実行することにより、crsに読み込まれるrsのデータを取得します。


     ResultSet rs = pstmt.executeQuery();
 

前のコードの抜粋では、背後で行われる処理について説明しました。これらのコードは、アプリケーション内では非表示であり、readDatadecodeParamsなどのメソッドを呼び出しません。 これに対し、次のコードはアプリケーション内で行われる処理を示したものです。 行セットのコマンドを設定し、コマンドのパラメータを設定し、コマンドを実行しています。 executeメソッドを呼び出すだけで、crsに、要求された表CUSTOMERSのデータが読み込まれます。


    crs.setCommand("SELECT FIRST_NAME, LAST_NAME, ADDRESS FROM CUSTOMERS" +
                   "WHERE CREDIT_LIMIT > ? AND REGION = ?");
    crs.setInt(1, 5000);
    crs.setString(2, "West");
    crs.execute();
 

10.0 ページング・データ

CachedRowSetオブジェクトはデータをメモリーに格納するため、一度に格納できるデータの量は使用可能なメモリーの量によって決まります。 この制限を回避するため、CachedRowSetオブジェクトでは、ResultSetオブジェクトからページと呼ばれるチャンクで、データを取得できます。 このメカニズムを利用するには、アプリケーションで、setPageSizeメソッドを使用して、ページに含める行数を設定します。 つまり、ページ・サイズを5に設定している場合、データ・ソースから一度に5行のデータのチャンクがフェッチされます。 また、アプリケーションでは、オプションで、一度にフェッチできる最大行数も設定できます。 最大行数を0に設定した場合、または最大行数を設定しない場合、一度にフェッチ可能な行数の制限はありません。

プロパティの設定後、CachedRowSetオブジェクトに、populateまたはexecuteメソッドを使用して、データを格納する必要があります。 次のコード行に、populateメソッドを使用した例を示します。 このメソッドでは、ResultSetハンドルと、行の取得を開始するResultSetオブジェクト内の行の2つのパラメータをとります。

     CachedRowSet crs = new CachedRowSetImpl();
     crs.setMaxRows(20);
     crs.setPageSize(4);
     crs.populate(rsHandle, 10);
 
このコードを実行すると、crsrsHandleの10行目から始まる4行分が格納されます。

次のコードの抜粋にexecuteメソッドを使用して、CachedRowSetオブジェクトに格納する例を示します。このメソッドはパラメータとしてConnectionオブジェクトをとる場合ととらない場合があります。 このコードではexecuteConnectionオブジェクトconHandleを渡しています。

次のコードの抜粋と上記のコードには2つの違いがあります。 まず、setMaxRowsメソッドを呼び出していないため、crsに格納できる最大行数に制限がありません。 (crsには常に、メモリー内に格納できるデータ量の制限が最優先で存在することに注意してください)。 2点目の違いはexecuteメソッドに、行の取得を開始するResultSetオブジェクト内からの行番号を渡せないことです。 このメソッドは常に先頭行から開始します。

     CachedRowSet crs = new CachedRowSetImpl();
     crs.setPageSize(5);
     crs.execute(conHandle);
 
このコードを実行すると、crsに対するコマンドによって生成されたResultSetオブジェクトから5行分のデータがcrsに格納されます。 crsライターはconHandleを使用してデータ・ソースに接続し、crsに対してコマンドを実行します。 これにより、アプリケーションは、ほかのCachedRowSetオブジェクトのデータの操作と同じようにcrsのデータを操作できます。

アプリケーションで次のページ(データのチャンク)にアクセスするには、nextPageメソッドを呼び出します。 このメソッドは新しいCachedRowSetオブジェクトを作成し、それに次のページのデータを格納します。 たとえば、CachedRowSetオブジェクトのコマンドが1000行分のデータを格納するResultSetオブジェクトrsを返したとします。 ページ・サイズが100に設定されている場合、nextPageメソッドの最初の呼出しで、rsの先頭の100行を格納するCachedRowSetオブジェクトが作成されます。 この先頭の100行のデータの処理が終わったら、アプリケーションはふたたびnextPageメソッドを呼び出して、rsから次の100行を格納する別のCachedRowSetオブジェクトを作成できます。 最初のCachedRowSetオブジェクトのデータは、2番目のCachedRowSetオブジェクトのデータに置き換えられているため、メモリー内に残っていません。 nextPageメソッドの10回目の呼出しでは、10番目のCachedRowSetオブジェクトにrsからの最後の100行のデータが格納され、これらがメモリーに格納されます。 常にメモリーには、1つのCachedRowSetオブジェクトのデータだけが格納されることになります。

nextPageメソッドは、現在のページが行の最後のページでない間はtrueを返し、それ以降のページがなくなるとfalseを返します。 したがって、次のコード行に示すように、whileループで使用すれば、すべてのページを取得できます。

     CachedRowSet crs = CachedRowSetImpl();
     crs.setPageSize(100);
     crs.execute(conHandle);

     while(crs.nextPage()) {
         while(crs.next()) {
             . . . // operate on chunks (of 100 rows each) in crs,
                   // row by row
         }
     }
 
このコードの抜粋を実行すると、アプリケーションは1000行をすべてトラバースしますが、メモリーには一度に100行までしか格納されません。

CachedRowSetインタフェースはpreviousPageメソッドも定義しています。 nextPageメソッドがResultSetnextメソッドに類似しているのと同様、previousPageメソッドはResultSetpreviousメソッドに似ています。 nextPageメソッドと同様に、previousPageはページ・サイズとして設定されただけの行数を格納するCachedRowSetオブジェクトを作成します。 そのため、たとえば、前述のコードの抜粋の最後のwhileループ内でpreviousPageメソッドを使用して、最後のページから先頭のページまで、逆にページを移動できます。 previousPageメソッドは、whileループで使用できる点でnextPageとも似ています。ただし、前に別のページが存在する間trueを返し、それ以前のページがなくなると、falseを返す点が異なります。

次のコードの抜粋に示すように、previousメソッドは各ページの最後の行の末尾にカーソルを置くことにより、各ページの最終行から先頭行まで移動します。 もしくは、各ページの先頭行の前にカーソルを置き、whileループでnextメソッドを使用して、各ページの先頭行から最終行まで移動することもできます。

次のコードの抜粋では、上記のコードの抜粋の続きで、10個目のCachedRowSetオブジェクトのカーソルが最後の行にあると仮定しています。 このコードではカーソルを最終行のあとに移動しているため、previousメソッドの最初の呼出しで、カーソルを最終行に戻します。 最後のページ(CachedRowSetオブジェクトcrs)のすべての行を移動すると、コードはwhileループに入り、9ページ目に移動し、逆方向に行を移動し、8ページ目に移動し、逆方向に行を移動し、同様にして先頭ページの先頭行まで進んでいきます。

     crs.afterLast();
     while(crs.previous())  {
         . . . // navigate through the rows, last to first
     {
     while(crs.previousPage())  {
         crs.afterLast();
         while(crs.previous())  {
             . . . // go from the last row to the first row of each page
         }
     }
 

導入されたバージョン:
1.5
  • フィールド詳細

    • COMMIT_ON_ACCEPT_CHANGES

      @Deprecated static final boolean COMMIT_ON_ACCEPT_CHANGES
      非推奨。
      このフィールドはfinal (インタフェースの一部)であるため、その値を変更することはできません。
      acceptChanges()の呼出し時に、CachedRowSetオブジェクトのSyncProviderに変更をコミットさせます。 falseに設定されている場合、変更内容は、CachedRowSetインタフェース・トランザクション・メソッドが呼び出されるまでコミットされません
      関連項目:
      commit()rollback()定数フィールド値
  • メソッドの詳細

    • populate

      void populate(ResultSet data) throws SQLException
      このCachedRowSetオブジェクトに、指定されたResultSetオブジェクトのデータを読み込みます。

      このメソッドは、アプリケーションがオープンしているResultSetオブジェクトに接続しているときexecuteメソッドの代替として使用できます。 新しい接続を開いてこのCachedRowSetオブジェクトのコマンドを再実行する必要がない点で、populateメソッドは、パラメータを取らないexecuteメソッドよりも効率的です。 また、populateメソッドを使用することは、ResultSetオブジェクトを取るexecuteメソッドよりも便利です。

      パラメータ:
      data - このCachedRowSetオブジェクトに読み込むデータを含むResultSetオブジェクト
      例外:
      SQLException - nullのResultSetオブジェクトが提供された場合、またはこのCachedRowSetオブジェクトが関連するResultSetMetaDataオブジェクトを取得できない場合
      関連項目:
      execute(java.sql.Connection)ResultSetResultSetMetaData
    • execute

      void execute(Connection conn) throws SQLException
      データ・ソースとなる結果セットを生成するための指定の接続を使用して、このCachedRowSetオブジェクトにデータを読み込みます。 このメソッドは、作成するすべてのデータベース接続をクローズすることで、データ・ソースからデータを読み取っているときとデータ・ソースへデータを書き込んでいるとき以外、このCachedRowSetオブジェクトが未接続の状態であることを保証します。

      このCachedRowSetオブジェクトのリーダーは、行セットのコマンドを実行し、結果として生成されるResultSetオブジェクトからこのCachedRowSetオブジェクトにデータを読み込むために、connを使ってデータ・ソースへの接続を確立します。 また、このメソッドは、このCachedRowSetオブジェクトの生成後に、connをクローズします。

      実装の生成後にこのメソッドを呼び出すと、コンテンツとメタデータがリセットされます。 また、acceptChangesメソッドを呼び出して、まだ適用していない更新を確定したあと、このメソッドを呼び出すと、更新内容は失われます。

      パラメータ:
      conn - 有効なプロパティを持つ標準JDBC Connectionオブジェクト
      例外:
      SQLException - 無効なConnectionオブジェクトが提供された場合、またはデータ・ソースとの接続の確立時にエラーが発生した場合
      関連項目:
      populate(java.sql.ResultSet)Connection
    • acceptChanges

      void acceptChanges() throws SyncProviderException
      このCachedRowSetオブジェクトに対する行の更新、挿入、削除などの変更を配下のデータ・ソースへ伝達します。

      このメソッドは、このCachedRowSetオブジェクトのライター上で呼び出され、背後で処理を行います。 標準CachedRowSet実装は、SyncFactoryシングルトンを使ってSyncProviderインスタンスを取得することにより、RowSetWriterオブジェクト(ライター)を提供します。 ライターは、このCachedRowSetオブジェクトへの変更をデータ・ソースへ返送しようとします。

      acceptChangesメソッドが正常に実行された場合、データ・ソースへ変更が書き込まれ、現在の行の値が元の行の値に変更されます。

      使用するSyncProvider実装の同期レベルによって、ライターは元の値とデータ・ソース内の値を比較し、競合のチェックを行います。 競合が検出された場合、たとえばRIOptimisticProvider実装は、SyncProviderExceptionをスローし、データ・ソースへは何も書き込みません。

      アプリケーションは、SyncProviderExceptionオブジェクトをキャッチし、このオブジェクトに含まれるSyncResolverオブジェクトを取得することができます。 SyncResolverオブジェクトは、行ごとに競合を一覧し、現在存在する競合を解決するまで新しい競合が発生しないように、データ・ソースをロックします。 さらに、個々の競合に対して、競合を検査し、データ・ソースに残す値を設定するメソッドを提供します。 すべての競合が解決されると、アプリケーションは再度acceptChangesメソッドを呼び出して、解決された値をデータ・ソースへ書き込む必要があります。 データ・ソース内のすべての値がすでに持続値である場合、acceptChangesメソッドは何も行いません。

      一部のプロバイダ実装は、競合を防ぐためにロックを使用します。 この場合、acceptChangesメソッドを呼び出したとき、ライターによるデータ・ソースへの変更の書込みは必ず成功します。 このメソッドは、updateRowメソッド、insertRowメソッド、またはdeleteRowメソッドの呼出し後ただちに呼び出せますが、すべての変更が完了して、1つだけ接続を確立すればよい状態で呼び出したほうが効率的です。

      ノート: acceptChanges()メソッドは、COMMIT_ON_ACCEPT_CHANGESがtrueに設定されているかどうかを判断します。 trueに設定されている場合、同期内のすべての更新がデータ・ソースにコミットされます。 それ以外の場合は、アプリケーションがcommit()またはrollback()メソッドを適切に呼び出す必要があります。

      例外:
      SyncProviderException - 配下の同期プロバイダのライターが、データ・ソースへの更新の書込みに失敗した場合
      関連項目:
      acceptChanges(java.sql.Connection)RowSetWriterSyncFactorySyncProviderSyncProviderExceptionSyncResolver
    • acceptChanges

      void acceptChanges(Connection con) throws SyncProviderException
      指定されたConnectionオブジェクトを使ってデータ・ソースへの接続を確立して、CachedRowSetオブジェクトの配下のデータ・ソースへ行の更新、挿入、削除などの変更をすべて伝達します。

      もう一方のacceptChangesメソッドはRowSetオブジェクト内にすでに定義されているConnectionオブジェクト(初期生成時に使用される接続)を使用するので、接続を渡されません。

      この形式のacceptChangesメソッドは、引数を取らない形式とよく似ていますが、配下のデータ・ソースがJDBCデータ・ソースである場合にしか使用できない点で、その他の形式とは異なります。 SyncProviderは、CachedRowSetオブジェクトが正常に同期されるように、更新されたConnectionプロパティを使ってRowSetWriter構成をリセットする必要があります。

      acceptChangesメソッドが正常に実行された場合、データ・ソースへ変更が書き込まれ、現在の行の値が元の行の値に変更されます。

      使用するSyncProvider実装の同期レベルによって、ライターは元の値とデータ・ソース内の値を比較し、競合のチェックを行います。 競合が検出された場合、たとえばRIOptimisticProvider実装は、SyncProviderExceptionをスローし、データ・ソースへは何も書き込みません。

      アプリケーションは、SyncProviderExceptionオブジェクトをキャッチし、このオブジェクトに含まれるSyncResolverオブジェクトを取得することができます。 SyncResolverオブジェクトは、行ごとに競合を一覧し、現在存在する競合を解決するまで新しい競合が発生しないように、データ・ソースをロックします。 さらに、個々の競合に対して、競合を検査し、データ・ソースに残す値を設定するメソッドを提供します。 すべての競合が解決されると、アプリケーションは再度acceptChangesメソッドを呼び出して、解決された値をデータ・ソースへ書き込む必要があります。 データ・ソース内のすべての値がすでに持続値である場合、acceptChangesメソッドは何も行いません。

      一部のプロバイダ実装は、競合を防ぐためにロックを使用します。 この場合、acceptChangesメソッドを呼び出したとき、ライターによるデータ・ソースへの変更の書込みは必ず成功します。 このメソッドは、updateRowメソッド、insertRowメソッド、またはdeleteRowメソッドの呼出し後ただちに呼び出せますが、すべての変更が完了して、1つだけ接続を確立すればよい状態で呼び出したほうが効率的です。

      ノート: acceptChanges()メソッドは、COMMIT_ON_ACCEPT_CHANGESがtrueに設定されているかどうかを判断します。 trueに設定されている場合、同期内のすべての更新がデータ・ソースにコミットされます。 それ以外の場合は、アプリケーションがcommitまたはrollbackメソッドを適切に呼び出す必要があります。

      パラメータ:
      con - 標準JDBC Connectionオブジェクト
      例外:
      SyncProviderException - 配下の同期プロバイダのライターが、データ・ソースへの更新の書込みに失敗した場合
      関連項目:
      acceptChanges()RowSetWriterSyncFactorySyncProviderSyncProviderExceptionSyncResolver
    • restoreOriginal

      void restoreOriginal() throws SQLException
      このCachedRowSetオブジェクトを元の値(前回の変更セットの前の値)に戻します。 行セットが変更されていない場合や、変更セットが1つしかない場合は、このCachedRowSetオブジェクトに読み込まれた値が元の値になります。

      このメソッドが呼び出された場合、CachedRowSet実装は、現在の行セット・インスタンスへのすべての更新、挿入、および削除を以前の値で置き換える必要があります。 さらに、カーソルを最初の行に戻し、rowSetChangedイベントをトリガーして、登録済みのすべてのリスナーに通知を送る必要があります。

      例外:
      SQLException - このCachedRowSetオブジェクトの現在の値を以前の値に戻している間にエラーが発生した場合
      関連項目:
      RowSetListener.rowSetChanged(javax.sql.RowSetEvent)
    • release

      void release() throws SQLException
      このCachedRowSetオブジェクトの現在のコンテンツを解放し、登録済みのすべてのリスナーにrowSetChangedイベントを送信します。 このメソッドを呼び出すと、まだ適用されていない更新はすべて破棄され、行セットの行がすべて削除されます。 配下のデータ・ソースとの対話は行われないので、行セットのコンテンツ、メタデータ、コンテンツの更新を復元することはできません。

      このCachedRowSetオブジェクトは、コンテンツとその更新が完全にクリアされるまでロックされます。したがって、このRowSetオブジェクトへの参照を格納するその他のコンポーネントによるダーティ読取りは発生しません。 さらに、このCachedRowSetオブジェクトを読み取るすべてのコンポーネントが読み込みを完了するまで、コンテンツを解放することはできません。 このCachedRowSetオブジェクトの動作は、rowSetChangedイベントがトリガーされたあと、正常な状態に戻ります。

      JDBCプロパティとSynchronization SPIプロパティを含むメタデータは、将来使用するために保持されます。 commandプロパティなどのプロパティは、このCachedRowSetオブジェクトの生成元のデータ・ソースに関連付ける必要があります。

      closeメソッドは、すべての行セットを復元可能とし、ガベージ・コレクタに行セットのJava VMリソースを許可しますが、このメソッドは、行セットを空にします。

      例外:
      SQLException - このCachedRowSetオブジェクトのコンテンツのフラッシュ時にエラーが発生した場合
      関連項目:
      RowSetListener.rowSetChanged(javax.sql.RowSetEvent), ResultSet.close()
    • undoDelete

      void undoDelete() throws SQLException
      現在の行の削除を取り消して、リスナーに行が変更されたことを通知します。 このメソッドを呼び出したあと、現在の行は削除の対象から除外されます。 このメソッドは、行セットの寿命の間いつでも呼び出すことができます。

      さらに、複数の行の削除を取り消すこともできます。この場合は、次のようなカーソル位置制御メソッドを使って、カーソルの位置を調整します。

      • CachedRowSet.absolute
      • CachedRowSet.first
      • CachedRowSet.last

      例外:
      SQLException - (1)現在の行が削除されていない場合、(2)カーソルが挿入行、最初の行の前、または最終行の後ろにある場合
      関連項目:
      undoInsert(), ResultSet.cancelRowUpdates()
    • undoInsert

      void undoInsert() throws SQLException
      もし行が挿入された状態であれば、CachedRowSetオブジェクトから現在の行をただちに削除し、リスナーに行が変更されたことを通知します。 このメソッドは、行セットの寿命の間いつでも呼び出せます。現在の行が例外制限(下記参照)内にある場合、現在の行の挿入を取り消します。

      さらに、複数の行の挿入を取り消すこともできます。この場合は、次のようなカーソル位置制御メソッドを使って、カーソルの位置を調整します。

      • CachedRowSet.absolute
      • CachedRowSet.first
      • CachedRowSet.last

      例外:
      SQLException - (1)現在の行が挿入されていない場合、(2)カーソルが最初の行の前、最終行の後ろ、または挿入行にある場合
      関連項目:
      undoDelete(), ResultSet.cancelRowUpdates()
    • undoUpdate

      void undoUpdate() throws SQLException
      もし行が変更されていれば、前回の更新操作をただちに元に戻します。 このメソッドは、最終的に行内のすべての更新が前回の同期化(acceptChanges)または生成の直前の状態に戻るように、すべての列の更新を元に戻します。 このメソッドは、挿入行の更新中にも呼び出すことができます。

      undoUpdateは、行セットの寿命の間いつでも呼び出すことができます。ただし、同期化が行われたあと、行セットにさらに変更が加えられるまでは、このメソッドは何も行いません。

      例外:
      SQLException - カーソルがこのCachedRowSetオブジェクトの最初の行の前または最後の行の後にある場合
      関連項目:
      undoDelete(), undoInsert(), ResultSet.cancelRowUpdates()
    • columnUpdated

      boolean columnUpdated(int idx) throws SQLException
      このCachedRowSetオブジェクトの現在の行内の指定された列が更新されたかどうかを示します。
      パラメータ:
      idx - 更新のチェックを行う列を示すint
      戻り値:
      指定された列が明らかに更新されている場合はtrue、そうでない場合はfalse
      例外:
      SQLException - カーソルが挿入行、最初の行の前、または最終行の後ろにある場合
      関連項目:
      DatabaseMetaData.updatesAreDetected(int)
    • columnUpdated

      boolean columnUpdated(String columnName) throws SQLException
      このCachedRowSetオブジェクトの現在の行内の指定された列が更新されたかどうかを示します。
      パラメータ:
      columnName - 更新のチェックを行う列の名前を指定するStringオブジェクト
      戻り値:
      列が明らかに更新されている場合はtrue、そうでない場合はfalse
      例外:
      SQLException - カーソルが挿入行、最初の行の前、または最終行の後ろにある場合
      関連項目:
      DatabaseMetaData.updatesAreDetected(int)
    • toCollection

      Collection<?> toCollection() throws SQLException
      このCachedRowSetオブジェクトを、このCachedRowSetオブジェクトのすべてのデータを格納するCollectionオブジェクトに変換します。 Collectionフレームワークの抽象性により、実装は、このCollectionオブジェクトをある程度自由に表現することができます。 各行は汎用的なCollection実装か、またはTreeMapオブジェクトやVectorオブジェクトなどの特殊なCollection実装のどちらかで完全に表現する必要があります。 SQL NULL列値はJavaプログラミング言語でnullとして表現する必要があります。

      CachedRowSetインタフェースの標準的なリファレンス実装では、行セットにTreeMapオブジェクトを使用し、各行の値をVectorオブジェクトに格納します。 大半の実装で同様に処理することが想定されます。

      TreeMap型のコレクションによって、キーのクラスの本来の順序に従って、マップが昇順でソートされます。 各キーは、RowSetオブジェクトの1行に対応するVectorオブジェクトを参照します。 したがって、各Vectorオブジェクトのサイズは、RowSetオブジェクト内の列数に正確に一致する必要があります。 TreeMapコレクションで使用するキーは、実装ごとに決定します。実装では、RowSetオブジェクト自体、または配下のSQLデータにすでに設定されているキーにより、内部のRowSet表構造内の使用可能なセット・キーを利用できます。

      戻り値:
      このCachedRowSetオブジェクトの各行の値を格納するCollectionオブジェクト
      例外:
      SQLException - コレクションの生成時にエラーが発生した場合
      関連項目:
      toCollection(int), toCollection(String)
    • toCollection

      Collection<?> toCollection(int column) throws SQLException
      このCachedRowSetオブジェクト内の指定された列をCollectionオブジェクトに変換します。 Collectionフレームワークの抽象性により、実装は、このCollectionオブジェクトをある程度自由に表現することができます。 各列値は汎用的なCollection実装か、またはVectorオブジェクトなどの特殊なCollection実装のどちらかで完全に表現する必要があります。 SQL NULL列値はJavaプログラミング言語でnullとして表現する必要があります。

      標準的なリファレンス実装では、Vectorオブジェクトを使用して、列値を格納しますが、大半の実装で同様に処理することが想定されます。 Vectorオブジェクトを使用する場合は、サイズをこのCachedRowSetオブジェクトの行数と正確に一致させる必要があります。

      パラメータ:
      column - 値をCollectionオブジェクトで表現する列を示すint
      戻り値:
      このCachedRowSetオブジェクトの指定された列に格納された値を含むCollectionオブジェクト
      例外:
      SQLException - コレクションの生成時にエラーが発生した場合、または無効な列IDが提供された場合
      関連項目:
      toCollection(), toCollection(String)
    • toCollection

      Collection<?> toCollection(String column) throws SQLException
      このCachedRowSetオブジェクト内の指定された列をCollectionオブジェクトに変換します。 Collectionフレームワークの抽象性により、実装は、このCollectionオブジェクトをある程度自由に表現することができます。 各列値は汎用的なCollection実装か、またはVectorオブジェクトなどの特殊なCollection実装のどちらかで完全に表現する必要があります。 SQL NULL列値はJavaプログラミング言語でnullとして表現する必要があります。

      標準的なリファレンス実装では、Vectorオブジェクトを使用して、列値を格納しますが、大半の実装で同様に処理することが想定されます。 Vectorオブジェクトを使用する場合は、サイズをこのCachedRowSetオブジェクトの行数と正確に一致させる必要があります。

      パラメータ:
      column - コレクションで表現される値を持つ列の名前を指定するStringオブジェクト
      戻り値:
      このCachedRowSetオブジェクトの指定された列に格納された値を含むCollectionオブジェクト
      例外:
      SQLException - コレクションの生成時にエラーが発生した場合、または無効な列IDが提供された場合
      関連項目:
      toCollection(), toCollection(int)
    • getSyncProvider

      SyncProvider getSyncProvider() throws SQLException
      このCachedRowSetオブジェクトのSyncProvider実装を取得します。 行セットは、このメソッドを内部で使用して、行セットとデータ・ソース間の読み取りまたは書込み操作をトリガーします。 たとえば、行セットにSyncProviderから行セット・リーダー(RowSetReaderオブジェクト)のハンドルを取得して、行セットを入力できるようにする必要があります。
           RowSetReader rowsetReader = null;
           SyncProvider provider =
               SyncFactory.getInstance("javax.sql.rowset.provider.RIOptimisticProvider");
               if (provider instanceof RIOptimisticProvider) {
                   rowsetReader = provider.getRowSetReader();
               }
       
      rowsetReaderが行セット実装内のprivateなアクセス可能フィールドであるとすると、アプリケーションがexecuteメソッドを呼び出すと、このメソッドはリーダーのreadDataメソッドを呼び出して、RowSetオブジェクトにデータを格納します。
           rowsetReader.readData((RowSetInternal)this);
       

      さらに、アプリケーションはこのメソッドから返されるSyncProviderオブジェクトを使用して、ベンダー、バージョン、プロバイダID、同期のグレード、現在設定されているロックなどのSyncProviderオブジェクトに関する情報を返すメソッドを呼び出すことができます。

      戻り値:
      行セットのインスタンス化時に設定されたSyncProviderオブジェクト、または設定されていない場合はデフォルト・プロバイダ
      例外:
      SQLException - SyncProviderオブジェクトを返すときにエラーが発生した場合
      関連項目:
      setSyncProvider(java.lang.String)
    • setSyncProvider

      void setSyncProvider(String provider) throws SQLException
      このCachedRowSetオブジェクトのSyncProviderオブジェクトを、指定されたオブジェクトに設定します。 このメソッドで、SyncProviderオブジェクトをリセットできます。

      CachedRowSet実装は常に利用可能なSyncProviderメカニズムでインスタンス化する必要がありますが、SyncProviderオブジェクトのリセットが望ましい、または必要とされる場合もあります。 たとえば、アプリケーションで、しばらくはデフォルトのSyncProviderオブジェクトを使用しておき、あとで最近利用できるようになった、より必要にかなうプロバイダを選択して使用することができます。

      SyncProviderオブジェクトをリセットすると、RowSetオブジェクトはSyncFactoryから新しいSyncProvider実装を要求します。 これにより、以前のすべての接続と元のデータ・ソースとの関係をリセットし、未接続の行セットの同期動作を大幅に変更することができます。

      パラメータ:
      provider - SyncProvider実装の完全修飾クラス名を指定するStringオブジェクト
      例外:
      SQLException - SyncProvider実装のリセット中にエラーが発生した場合
      関連項目:
      getSyncProvider()
    • size

      int size()
      このCachedRowSetオブジェクト内の行数を返します。
      戻り値:
      行セット内の行数
    • setMetaData

      void setMetaData(RowSetMetaData md) throws SQLException
      指定されたRowSetMetaDataオブジェクトを使って、CachedRowSetオブジェクトのメタデータを設定します。 RowSetReaderオブジェクトは、行セットのコンテンツを読み取る際に、RowSetMetaDataオブジェクトを生成し、RowSetMetaData実装内のメソッドを使ってこれを初期化します。 リファレンス実装ではRowSetMetaDataImplクラスを使用します。 リーダーが行セットのコンテンツの読取りを完了すると、このメソッドが内部で呼び出され、RowSetMetaDataオブジェクトが行セットに渡されます。
      パラメータ:
      md - このCachedRowSetオブジェクト内の列に関するメタデータを含むRowSetMetaData
      例外:
      SQLException - 行セットに無効なメタデータが提供された場合
    • getOriginal

      ResultSet getOriginal() throws SQLException
      このCachedRowSetオブジェクトの元の値を格納するResultSetオブジェクトを返します。

      ResultSetオブジェクトのカーソルは、先頭行の前に置く必要があります。 さらに、返されるResultSetオブジェクトは次のプロパティを持つ必要があります。

      • ResultSet.TYPE_SCROLL_INSENSITIVE
      • ResultSet.CONCUR_UPDATABLE

      RowSetオブジェクトの元の値は、配下のデータ・ソースと最後の同期の前に格納されていた値です。 同期がなかった場合、元の値は、RowSetオブジェクトに格納された値になります。 このメソッドは、アプリケーションがacceptChangesメソッドを呼び出し、SyncProviderオブジェクトが競合を確認するように実装されている場合に、内部で呼び出されます。 この場合、ライターは元の値とデータ・ソース内の現在の値を比較し、競合を確認します。

      戻り値:
      このCachedRowSetオブジェクトの元の値を格納するResultSetオブジェクト
      例外:
      SQLException - ResultSetオブジェクトの生成時にエラーが発生した場合
    • getOriginalRow

      ResultSet getOriginalRow() throws SQLException
      このCachedRowSetオブジェクトの現在行の元の値のみを格納するResultSetオブジェクトを返します。

      ResultSetオブジェクトのカーソルは、先頭行の前に置く必要があります。 さらに、返されるResultSetオブジェクトは次のプロパティを持つ必要があります。

      • ResultSet.TYPE_SCROLL_INSENSITIVE
      • ResultSet.CONCUR_UPDATABLE

      戻り値:
      行の元の結果セット
      例外:
      SQLException - 現在行が存在しない場合
      関連項目:
      setOriginalRow()
    • setOriginalRow

      void setOriginalRow() throws SQLException
      このCachedRowSetオブジェクトの現在の行を元の行として設定します。

      このメソッドは、現在の行の変更された値がデータ・ソースと同期されたあとに、内部で呼び出されます。 現在の行は、挿入、削除、または更新としてタグ付けしてあってはいけません。

      setOriginalRowの呼出しは取り消せません。

      例外:
      SQLException - 現在行が存在しない場合、または元の行のコンテンツのリセット時にエラーが発生した場合
      関連項目:
      getOriginalRow()
    • getTableName

      String getTableName() throws SQLException
      このCachedRowSetオブジェクトの作成に使用されたオブジェクト(テーブル)の識別子を返します。 この名前は、繰返し設定できます。名前の設定回数や、標準実装が以前のテーブル名を追跡する必要があるかどうかについては、仕様による制限はありません。
      戻り値:
      このCachedRowSetオブジェクトのデータのソースであるテーブル名を指定するStringオブジェクト。または、テーブルの名前を設定していない場合はnull
      例外:
      SQLException - テーブル名を返すときにエラーが発生した場合
      関連項目:
      ResultSetMetaData.getTableName(int)
    • setTableName

      void setTableName(String tabName) throws SQLException
      このCachedRowSetオブジェクトの派生元のテーブルの識別子を、指定のテーブル名に設定します。 ライターは、同期時に、この名前を使用して、データ・ソースの値とCachedRowSetオブジェクトの値を比較する際に使用するテーブルを判断します。 テーブルの識別子は、このCachedRowSetオブジェクトから変更された値を書き込む場所も示します。

      このCachedRowSetオブジェクトの実装では、内部的にRowSetMetaDataImplオブジェクトに名前を取得させることができます。

      パラメータ:
      tabName - このCachedRowSetオブジェクトが派生したテーブルを識別するStringオブジェクト。nullは不可、空の文字列は可能
      例外:
      SQLException - テーブルの名前付けでエラーが発生した場合、またはtabNamenullの場合
      関連項目:
      RowSetMetaData.setTableName(int, java.lang.String)RowSetWriterSyncProvider
    • getKeyColumns

      int[] getKeyColumns() throws SQLException
      このCachedRowSetオブジェクトの行を一意に識別するキーを構成する列を示す1つ以上の列番号を格納する配列を返します。
      戻り値:
      このCachedRowSetオブジェクトの行の主キーを構成する列を示す列番号を格納する配列。 主キーを表現する列がない場合、この配列は空になる。
      例外:
      SQLException - このCachedRowSetオブジェクトが空の場合
      関連項目:
      setKeyColumns(int[]), Joinable.getMatchColumnIndexes(), Joinable.getMatchColumnNames()
    • setKeyColumns

      void setKeyColumns(int[] keys) throws SQLException
      このCachedRowSetオブジェクトのkeyColsフィールドに、指定された列番号の配列(このCachedRowSetオブジェクト内の行を一意に識別するキーを構成する)を設定します。

      CachedRowSetオブジェクトがJoinRowSetオブジェクトに含まれる場合、キー列として指定された列が一致列になれば、このメソッドで定義されたキーと生成された制約は保持されます。

      パラメータ:
      keys - このCachedRowSetオブジェクトの主キーを構成する列を示すint配列。配列内の各要素は、0より大きく、この行セット内の列数以下である必要がある
      例外:
      SQLException - 指定された配列内の番号がこの行セットで有効でない場合
      関連項目:
      getKeyColumns(), Joinable.setMatchColumn(String), Joinable.setMatchColumn(int)
    • createShared

      RowSet createShared() throws SQLException
      このCachedRowSetオブジェクトと同じデータによって、バックアップされた新しいRowSetオブジェクトを返します。 実際に両方のCachedRowSetオブジェクトは同じデータ上にカーソルを持ちます。 その結果、元のオブジェクトによる変更が、そのすべての重複に可視であるのと同様に、重複によるすべての変更が、元のオブジェクトと、その他のすべての重複に可視になります。 重複で配下のデータを変更するメソッドを呼び出すと、そのメソッドは、元のCachedRowSetオブジェクトによって呼び出される場合とまったく同じように、登録されたすべてのリスナーに通知します。

      さらに、このメソッドによって作成されるRowSetオブジェクトはこのCachedRowSetオブジェクトと同じプロパティを持ちます。 たとえば、このCachedRowSetオブジェクトが読取り専用の場合、そのすべての重複も読取り専用になります。 これを更新可能に変更すると、重複も更新可能になります。

      ノート: 複数のスレッドがcreateShared()メソッドによって作成されたRowSetオブジェクトにアクセスする場合、共有データの整合性を確保するため、次の動作が指定されます。すべての共有されたRowSetオブジェクトの読取りと書込みは、各オブジェクトと配下の単一の表構造間で逐次行われる必要があります。

      戻り値:
      このCachedRowSetオブジェクトと同じプロパティを持ち、同じデータ上にカーソルを持つ新しい共有RowSetオブジェクト
      例外:
      SQLException - エラーが発生した場合、または配下のプラットフォームでクローニングがサポートされていない場合
      関連項目:
      RowSetEventRowSetListener
    • createCopy

      CachedRowSet createCopy() throws SQLException
      このCachedRowSetオブジェクトのデータのディープ・コピーであるRowSetオブジェクトを作成します。 createShared呼出しによって生成されたRowSetオブジェクトの場合とは異なり、元のRowSetオブジェクトのコピーの更新が、元のRowSetオブジェクトに可視であってはいけません。 また、元のRowSetに登録されたイベント・リスナーのスコープに、新しいRowSetコピーが含まれていてはなりません。 また、確立済みの制約制限は保持されなければいけません。
      戻り値:
      新しいRowSetオブジェクト。CachedRowSetオブジェクトのディープ・コピーであり、このCachedRowSetオブジェクトからは完全に独立している
      例外:
      SQLException - CachedRowSetオブジェクトのコピーの生成時にエラーが発生した場合
      関連項目:
      createShared()createCopySchema()createCopyNoConstraints()RowSetEventRowSetListener
    • createCopySchema

      CachedRowSet createCopySchema() throws SQLException
      このCachedRowSetオブジェクトの空のコピーであるCachedRowSetオブジェクトを作成します。 コピーには、何も含めず、元のCachedRowSetオブジェクトの表構造だけを表現する必要があります。 さらに、元のCachedRowSetオブジェクトに設定された主キーまたは外部キーの制約を、新しい空のCachedRowSetオブジェクトにも等しく適用する必要があります。 createSharedメソッド呼出しによって生成されたRowSetオブジェクトとは異なり、createCopySchemaメソッドによるこのCachedRowSetオブジェクトのコピーへの更新は可視にしてはいけません。

      アプリケーションは、このメソッドによって返されたCachedRowSetオブジェクトからWebRowSetオブジェクトを形成し、あとで使用するために、RowSetスキーマ定義をXMLにエクスポートできます。

      戻り値:
      このCachedRowSetオブジェクトの空のコピー
      例外:
      SQLException - このCachedRowSetオブジェクトの構造のクローニング時にエラーが発生した場合
      関連項目:
      createShared()createCopySchema()createCopyNoConstraints()RowSetEventRowSetListener
    • createCopyNoConstraints

      CachedRowSet createCopyNoConstraints() throws SQLException
      このCachedRowSetオブジェクトのデータのディープ・コピーであるが、独立しているCachedRowSetオブジェクトを作成します。 createSharedメソッド呼出しによって生成されたRowSetオブジェクトの場合とは異なり、このCachedRowSetオブジェクトのコピーに対して行われた変更は可視であってはいけません。 さらに、このCachedRowSetオブジェクトによって登録されたすべてのイベント・リスナーのスコープに新しいRowSetオブジェクトが含まれていてはいけません。 また、このCachedRowSetオブジェクトに対して確立された制約制限はコピーに維持されていてはいけません
      戻り値:
      新しいCachedRowSetオブジェクト。CachedRowSetオブジェクトのディープ・コピーであり、このCachedRowSetオブジェクトからは完全に独立している
      例外:
      SQLException - CachedRowSetオブジェクトのコピーの生成時にエラーが発生した場合
      関連項目:
      createCopy()createShared()createCopySchema()RowSetEventRowSetListener
    • getRowSetWarnings

      RowSetWarning getRowSetWarnings() throws SQLException
      このRowSetオブジェクトに関する呼出しによって報告される最初の警告を取得します。 後続のRowSetオブジェクトの警告は、このメソッドが返すRowSetWarningオブジェクトにチェーンされます。 警告チェーンは、新しい行が読み込まれるたびに自動的にクリアされます。 クローズ済のRowSetオブジェクトでこのメソッドを呼び出すことはできません。そうした場合にはSQLExceptionがスローされます。
      戻り値:
      最初のRowSetWarningオブジェクトが報告したRowSetWarning。ない場合はnull
      例外:
      SQLException - このメソッドが、閉じられたRowSet上で呼び出された場合
      関連項目:
      RowSetWarning
    • getShowDeleted

      boolean getShowDeleted() throws SQLException
      削除マークが付けられた行を現在の行とともに表示するかどうかを示すbooleanを取得します。 trueが返された場合、削除行は現在の行とともに表示されます。 falseが返された場合、削除行は現在の行のセット内に表示されません。 デフォルト値はfalseです。

      標準行セット実装は、セキュリティ上の配慮または特定の配備シナリオに適合させるため、この動作を制限することができます。 これは、定義済みの実装として残され、標準の動作を表しません。

      ノート: 削除された行を表示すると、一部の標準JDBC RowSet実装メソッドの動作が複雑になります。 しかし、削除された行を表示する機能は、非常に専門的なアプリケーションでしか使用されません。したがって、ほとんどの行セット・ユーザーは、この余分な詳細を無視してかまいません。

      戻り値:
      削除された行を表示する場合はtrue、そうでない場合はfalse
      例外:
      SQLException - 行セット実装が、削除行が表示されるかどうかを判断できない場合
      関連項目:
      setShowDeleted(boolean)
    • setShowDeleted

      void setShowDeleted(boolean b) throws SQLException
      showDeletedプロパティとして、削除マーク付きの行を現在の行とともに表示するかどうかを指定するbooleanを設定します。 値がtrueの場合、削除された行が現在の行セットとともに表示されます。 値がfalseの場合、削除された行は現在の行セット内に表示されません。

      標準行セット実装は、セキュリティ上の配慮または特定の配備シナリオに適合させるため、この動作を制限することができます。 これは、定義済みの実装として残され、標準の動作を表しません。

      パラメータ:
      b - 削除された行を表示する場合はtrue、そうでない場合はfalse
      例外:
      SQLException - 行セット実装が、削除行の表示または非表示の設定をリセットできない場合
      関連項目:
      getShowDeleted()
    • commit

      void commit() throws SQLException
      CachedRowSetオブジェクトのSyncProviderには、ResultSetConnectionオブジェクトか、コンストラクタに渡されるJDBCプロパティが含まれます。 このメソッドは、Connectionコミット・メソッドをラップして、柔軟な自動コミットまたは非自動コミットのトランザクション制御サポートを提供します。

      前回のコミット/ロールバックのあと、acceptChanges()メソッドによって行われたすべての変更を永続的なものにします。 このメソッドは自動コミット・モードが無効になっているときしか使用できません。

      例外:
      SQLException - データベース・アクセス・エラーが発生した場合、またはこのCachedRowSet内のConnectionオブジェクトが自動コミット・モードである場合
      関連項目:
      Connection.setAutoCommit(boolean)
    • rollback

      void rollback() throws SQLException
      CachedRowSetオブジェクトのSyncProviderには、元のResultSetConnectionオブジェクトか、それに渡されるJDBCプロパティが含まれます。

      現在のトランザクションでのすべての変更を取り消します。 このメソッドは自動コミット・モードが無効になっているときしか使用できません。

      例外:
      SQLException - データベース・アクセス・エラーが発生した場合、またはこのCachedRowSet内のConnectionオブジェクトが自動コミット・モードである場合。
    • rollback

      void rollback(Savepoint s) throws SQLException
      CachedRowSetオブジェクトのSyncProviderには、元のResultSetConnectionオブジェクトか、それに渡されるJDBCプロパティが含まれます。

      現在のトランザクションでのすべての変更を取り消して、最後のSavepointトランザクション・マーカーに戻します。 このメソッドは自動コミット・モードが無効になっているときしか使用できません。

      パラメータ:
      s - Savepointトランザクション・マーカー
      例外:
      SQLException - データベース・アクセス・エラーが発生した場合、またはこのCachedRowSet内のConnectionオブジェクトが自動コミット・モードである場合。
    • rowSetPopulated

      void rowSetPopulated(RowSetEvent event, int numRows) throws SQLException
      登録済みリスナーに、指定されたRowSetEventオブジェクト内のRowSetオブジェクトが多数の追加行を読み込んだことを通知します。 numRowsパラメータにより、このイベントは、numRowごとにトリガーされます。

      イベントのソースはevent.getSourceメソッドで取得できます。

      パラメータ:
      event - イベントのソースであるRowSetオブジェクトを格納するRowSetEventオブジェクト
      numRows - 読込み時の行の間隔数。ここで、読み込まれたCachedRowSetがトリガーされる。デフォルト値はゼロ。fetchSizeより小さい値とゼロより小さい値は指定できない
      例外:
      SQLException - numRows < 0 または numRows < getFetchSize()
    • populate

      void populate(ResultSet rs, int startRow) throws SQLException
      このCachedRowSetオブジェクトに、指定されたResultSetオブジェクトのデータを読み込みます。 populate(ResultSet)メソッドに関連付けられている場合、追加パラメータにより、CachedRowSetインスタンスの読込みを開始するResultSet内の開始位置を指定することができます。

      このメソッドは、アプリケーションがオープンしているResultSetオブジェクトに接続しているときexecuteメソッドの代替として使用できます。 新しい接続を開いてこのCachedRowSetオブジェクトのコマンドを再実行する必要がない点で、populateメソッドは、パラメータを取らないexecuteメソッドよりも効率的です。 また、populateメソッドを使用することは、ResultSetオブジェクトを取るexecuteメソッドよりも便利です。

      パラメータ:
      startRow - このCachedRowSetへのレコードの読込みを開始する、ResultSet内の位置
      rs - このCachedRowSetオブジェクトに読み込むデータを含むResultSetオブジェクト
      例外:
      SQLException - nullのResultSetオブジェクトが提供された場合、またはこのCachedRowSetオブジェクトが関連するResultSetMetaDataオブジェクトを取得できない場合
      関連項目:
      execute(java.sql.Connection)populate(ResultSet)ResultSetResultSetMetaData
    • setPageSize

      void setPageSize(int size) throws SQLException
      CachedRowSetオブジェクトのページ・サイズを設定します。 CachedRowSetは、自身をページ・サイズで設定された行数の行に読み込む構成にできます。 populate()またはexecute()が呼び出されると、CachedRowSetは、RowSetの読込み使用した元のSQLクエリーに従って、追加ページをフェッチします。
      パラメータ:
      size - CachedRowSetのページ・サイズ
      例外:
      SQLException - CachedRowSetページ・サイズの設定時にエラーが発生した場合、またはページ・サイズがゼロより小さい場合。
    • getPageSize

      int getPageSize()
      CachedRowSetオブジェクトのページ・サイズを返します。
      戻り値:
      ページ・サイズを表すint
    • nextPage

      boolean nextPage() throws SQLException
      CachedRowSetの現在のページを増分します。 これにより、CachedRowSet実装は、次のページ・サイズ分の行をフェッチし、RowSetに読み込みます。ただし、このためには、その他の行がRowSetの読込みに使用された元のSQLクエリーのスコープ内に残っていなければいけません。
      戻り値:
      まだページがある場合はtrue、これが最後のページである場合はfalse
      例外:
      SQLException - 次のページのフェッチ時にエラーが発生した場合、またはこのメソッドがpopulateやexecuteの実行前に早く呼び出されすぎた場合。
    • previousPage

      boolean previousPage() throws SQLException
      CachedRowSetの現在のページを減分します。 これにより、CachedRowSet実装は、以前のページ・サイズ分の行をフェッチし、RowSetに読み込みます。 以前のページ内の返された行の量は、RowSetの読込みに使用された元のSQLクエリーのスコープ内に残っている必要があります。
      戻り値:
      前のページが正常に取得された場合はtrue、これが最初のページである場合はfalse。
      例外:
      SQLException - 以前のページのフェッチ時にエラーが発生した場合、またはこのメソッドがpopulateやexecuteの実行前に早く呼び出されすぎた場合。