16.3.1 結果セットの拡張
JDBC2.0基本規格では,結果セット(ResultSetクラス)の拡張機能として「スクロール」と「並行処理」が追加されました。
(1) スクロールタイプ
結果セットのスクロールタイプには,次の3種類があります。
(a) 順方向専用型
JDBC1.0からの標準のスクロールタイプです。結果セット内を順方向(上から下)にだけスクロールできます。
(b) スクロール非反映型
JDBC2.0で追加されたスクロールタイプです。結果セット内を順方向又は逆方向にスクロールできます。また,現在の位置からの相対位置指定の移動,又は絶対位置への移動もできます。
「非反映型」とは,結果セットが開かれている間に加えられた変更が,その結果セットに反映されないということを意味します。つまり,基盤となるデータの静的なビューを提供するだけで,結果セットに含まれる行,その順序,及び列の値は,結果セットの作成時に固定されます。
(c) スクロール反映型
JDBC2.0で追加されたスクロールタイプです。結果セットが開かれている間に加えられた変更が,その結果セットに反映されます。
「変更の反映」という点では,「その結果セット自身による変更の反映」,「同一トランザクション内でのほかの結果セットによる変更の反映」,「他トランザクションによる変更の反映」などがあります。どこまで保証されるかは,ドライバの実装レベル,及びDBMSのトランザクション遮断レベルに依存します。
(2) 並行処理タイプ
結果セットの並行処理タイプには,次の2種類があります。
(a) 読み取り専用型
JDBC1.0からの標準の並行処理タイプです。結果セットからの更新はできません。
(b) 更新可能型
JDBC2.0で追加された並行処理タイプです。結果セットからの更新(UPDATE,INSERT,及びDELETE)ができます。
(3) 結果セットタイプ
スクロールタイプと並行処理タイプを組み合わせると,結果セットタイプは6種類になります。結果セットタイプは,ConnectionクラスのcreateStatementメソッド,prepareStatementメソッド,又はprepareCallメソッドでStatementクラス(又はそのサブクラス)のインスタンスを取得する場合に指定します。
結果セットタイプとJDBCドライバでの提供可否を次の表に示します。
結果セットタイプ |
JDBCドライバでの提供可否 |
|
---|---|---|
スクロールタイプ |
並行処理タイプ |
|
順方向専用型 |
読み取り専用型 |
○ |
更新可能型 |
× |
|
スクロール非反映型 |
読み取り専用型 |
○ |
更新可能型 |
× |
|
スクロール反映型 |
読み取り専用型 |
× |
更新可能型 |
× |
- (凡例)
-
○:提供されます。
×:提供されません。
- 注1
-
提供されていない結果セットタイプを指定した場合,エラーにはなりません。この場合,指定した結果セットタイプに一番近い結果セットタイプを使用してStatementクラス(又はそのサブクラス)のインスタンスを生成し,警告メッセージをConnectionクラスのSQLWarningに格納します。
- 注2
-
更新可能型の並行処理タイプはJDBCドライバでは提供されていないため,ResultSetクラスには使用できないメソッドがあります。これらの使用できないメソッドが呼び出された場合,無条件にSQLExceptionを投入します。使用できないメソッドについては,「制限事項があるクラスとメソッド」を参照してください。
(4) スクロール型結果セット使用時の注意点
スクロール型結果セットでは,すべての検索データをJDBCドライバ内でキャッシングします。そのため,データ量が多い場合は,メモリ不足や性能劣化となる可能性が高くなります。したがって,スクロール型結果セットを使用する場合は,「SQLに条件を付加する」など,検索データ量をあらかじめ抑制しておく必要があります。