IBM Data Server Driver for JDBC and SQLJ での連続ストリーミング

データソースがプログレッシブストリーミング(ダイナミックデータフォーマットとも呼ばれる)をサポートしている場合、 IBM® Data Server Driver for JDBC and SQLJ プログレッシブストリーミングを使用して、LOBまたはXMLカラムのデータを取得することができます。

Db2 for z/OS® バージョン 9.1 以降では、LOBおよびXMLオブジェクトのプログレッシブストリーミングをサポートしています。 Db2 Linux®、UNIX、Windowsシステム バージョン 9.5 以降、 IBM Informix® バージョン 11.50 以降、および Db2 for IBM i V6R1 以降は、LOBのプログレッシブストリーミングをサポートしています。

連続ストリーミングを使用すると、LOB または XML オブジェクトのサイズに基づいて、LOB または XML のデータを戻すのに最も効率のよいモードがデータ・ソースで動的に判別されます。

連続ストリーミングは以下の環境でのデフォルトの動作です。
最低 IBM Data Server Driver for JDBC and SQLJ バージョン データ・サーバーの最小バージョン オブジェクトのタイプ
3.53 Db2 IBM i 宛て V6R1 LOB、XML
3.50 Db2 Linux、UNIX、Windowsシステム上で バージョン 9.5 LOB
3.50 IBM Informix バージョン 11.50 LOB
3.2 Db2 for z/OS バージョン9 LOB、XML

プログレッシブストリーミングの動作は、プロパティを使用して新しい接続で設定します。 IBM Data Server Driver for JDBC and SQLJprogressiveStreaming プロパティを使用します。

Db2 for z/OS バージョン 9.1 以降のデータ ソース、または Db2 on Linux、UNIX、および Windows システムバージョン 9.5 以降のデータ ソースの場合、既存の接続に対してプログレッシブ ストリーミング動作を設定できます。 DB2Connection.setDBProgressiveStreaming(DB2BaseDataSource.YES) 方法。 DB2Connection.setDBProgressiveStreaming(DB2BaseDataSource.YES)を呼び出す場合、接続に関して作成されるすべての ResultSet オブジェクトでは、連続ストリーミングの動作が使われます。

連続ストリーミングを使用可能に設定すると、JDBC ドライバーが streamBufferSize プロパティーで LOB をいつマテリアライズするかをコントロールできます。 LOB または XML オブジェクトが streamBufferSize 値以下であるとき、オブジェクトはマテリアライズされます。

progressiveStreaming や streamBufferSize の設定に関係なく、アプリケーション・プログラムが以下のいずれかのアクションを実行するときにも、LOB オブジェクトはマテリアライズされます。

  • LOB 値を引数としてユーザー定義関数を呼び出す
  • LOB 値を入力引数または出力引数としてストアード・プロシージャーを呼び出す
  • LOB ホスト変数を LOB ロケーター・ホスト変数に割り当てる
重要: プログレッシブ・ストリーミングでは、 ResultSet から LOB または XML 値をアプリケーション変数に取得すると、 ResultSet 上でカーソルを移動するか、カーソルを閉じるまで、そのアプリケーション変数の内容を操作することができます。 その後は、アプリケーション変数の内容は操作できなくなります。 アプリケーション変数内の LOB に対して何らかのアクションを実行すると、SQLException を受け取ります。 例えば、連続ストリーミングが有効で、以下のようなステートメントを実行するとします。
… 
ResultSet rs = stmt.executeQuery("SELECT CLOBCOL FROM MY_TABLE");
rs.next();                // Retrieve the first row of the ResultSet 
Clob clobFromRow1  = rs.getClob(1); 
                          // Put the CLOB from the first column of
                          // the first row in an application variable
String substr1Clob = clobFromRow1.getSubString(1,50);
                          // Retrieve the first 50 bytes of the CLOB
rs.next();                // Move the cursor to the next row.
                          // clobFromRow1 is no longer available.
// String substr2Clob = clobFromRow1.getSubString(51,100);
                          // This statement would yield an SQLException
Clob clobFromRow2  = rs.getClob(1); 
                          // Put the CLOB from the first column of 
                          // the second row in an application variable
rs.close();               // Close the ResultSet. 
                          // clobFromRow2 is also no longer available.
rs.next() を実行してカーソルを ResultSet の 2 番目の行に置いた後は、clobFromRow1 内の CLOB 値は使用できなくなります。 同様に、 rs.close() を実行して ResultSet を閉じた後は、 clobFromRow1 および clobFromRow2 の値は利用できなくなります。

プログレッシブストリーミングを無効にすると、 IBM Data Server Driver for JDBC and SQLJ LOBを処理する方法は、 fullyMaterializeLobData プロパティの値によって異なります。

連続ストリーミングの使用は、LOB または XML データ検索に推奨される方式です。