カテゴリを追加の最近のブログ記事

JDBC2.0から、スクロール可能なResultSetがサポートされています。それによって、ResultSetから、データをフェッチするときに、開始位置を指定したり、カーソルの移動を逆方向にすることができます。

このように便利な機能なのですが、Oracleで使用するときには、注意する必要があります。たまたまそのことを思い出したので、特に目新しいネタではないかもしれませんが、自分のメモを兼ねて、書いておこうと思います。

ResultSet からデータをフェッチする場合、setFetchSize(int)メソッドの規則に定められた行数のデータが、DBサーバから取得されるという前提で、プログラミングします。ところが、Oracleで「スクロール可能なResultSet」を使った場合、そのResultSetで対象となるデータが、一度に全件クライアント側にキャッシュされてしまいます。したがって、バッチ処理のように、大量のデータが対象になっていると、OutOfMemoryErrorが発生する可能性があるので注意が必要です。

以下に、そのことについて書かれた、Oracle社のドキュメントへのリンクを示しますので、詳細はそちらをご参照ください。
Oracle Database JDBC開発者ガイドおよびリファレンス 10g リリース2(10.2)
Oracle Database JDBC開発者ガイドおよびリファレンス 11g リリース1(11.1)