Hitachi

Hitachi Advanced Data Binder AP開発ガイド


7.4.1 データの検索方法

SELECT文を実行してデータを検索する場合,次に示す順序で処理を実行します。

〈この項の構成〉

(1) Statementオブジェクトの生成

Statementオブジェクトを生成して,SELECT文をHADBサーバに送ります。

なお,HADBサーバへの接続がすでに確立されている場合は,ConnectionオブジェクトのcreateStatementメソッドを使用してStatementオブジェクトを生成できます。

Statementオブジェクトの生成例を次に示します。

 // HADBサーバへ接続します
 Connection con = DriverManager.getConnection(url,info);
 
 // Statementオブジェクトを生成します
 Statement stmt = con.createStatement();

(2) SELECT文の実行

executeQueryメソッドの引数にSELECT文を指定してSELECT文を実行します。SELECT文の実行例を次に示します。

 Statement stmt = con.createStatement();
 
 // SELECT文を実行して,ResultSetオブジェクトを取得します
 ResultSet rs = stmt.executeQuery("SELECT \"CODE\", \"STATE\" FROM \"SAMPLE\"");

SELECT文を実行すると,ResultSetオブジェクトに検索結果が格納されます。

(3) 検索結果の取得

ResultSetオブジェクトには,列番号と検索結果に対応する値から構成される表の形式で検索結果が格納されます。ResultSetオブジェクトの形式の例を次の図に示します。

図7‒2 ResultSetオブジェクトの形式の例

[図データ]

ResultSetオブジェクトは,現在行を指し示すカーソルを保持しています。ResultSetオブジェクトから検索結果を取得するには,nextメソッドでカーソルを移動し,getXXXメソッドで現在行のデータを取得します。

ResultSetオブジェクトの作成時,先頭行の前にカーソルが位置づけられています。最初のnextメソッドの呼び出しによってカーソルは先頭行に移動します。nextメソッドが呼び出されるたびにカーソルが1行ずつ下に移動します。

検索結果データの取得例を次に示します。

 ResultSet rs = stmt.executeQuery("SELECT \"CODE\", \"STATE\" FROM \"SAMPLE\"");
 
 // 結果行がなくなるまで繰り返します
 while(rs.next())
 {
   // 1列目のデータを取得します
   int i = rs.getInt(1);
   // 2列目のデータを取得します
   String s = rs.getString(2);
   // 結果データを出力します
   System.out.println("検索結果: " + i + ", " + s);
 }

(4) 同一コネクションで複数のSELECT文を同時実行する際の注意事項

同一コネクションで複数のSELECT文を同時に実行すると,SELECT文の実行に必要な処理リアルスレッド数が不足することがあります。この場合,必要な処理リアルスレッド数が確保されるまで,処理リアルスレッドの確保処理が繰り返されます。そのため,次に示すどれかの対策を実施して,処理リアルスレッドの確保処理が無限に繰り返されることを防いでください。まずは,対策の1.が実施できるかどうかを検討してください。

対策

  1. APを修正する

    APの修正ができる場合は,不要となったResultSetオブジェクトをクローズするようにAPを修正してください。APの修正ができない場合は,2.の対策の実施を検討してください。

  2. サーバ定義を変更する

    次の計算式を満たすようにサーバ定義を変更できる場合は,サーバ定義を変更してください。

    AB×C×D

    A処理スレッド数(adb_sys_rthd_numオペランドの値)

    B最大SQL処理リアルスレッド数(adb_sql_exe_max_rthd_numオペランドの値)

    C1コネクション内で同時に実行する(カーソルオープン状態にする)SELECT文の数

    D同時にSQL文を実行するコネクション数

  3. 待ち時間を設定する

    上記の1.または2.の対策を実施できない場合は,必要な処理リアルスレッド数を確保できるまでの待ち時間を,次のメソッドまたはプロパティで指定してください。

    • StatementインタフェースのsetQueryTimeoutメソッド

    • システムプロパティ,ユーザプロパティ,または接続用のURLのプロパティのadb_clt_rpc_sql_wait_time