モジュール 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