2016-10-12 5 views
0

Javaプログラムでは、複雑なクエリ(内部ジョインとサブクエリを持つselect句)を使用しています。私は結果セットを繰り返し、テキストファイルに出力を書いています。JDBCでの反復Resultsetオブジェクト

SELECT句の出力は400,000レコードです。結果セットにこれらの多くのレコードが含まれていると問題が発生しますか? ResultSetにはいくつかのレコード/メモリの制限がありますか?

+0

使用しているデータベースはどれですか。結果セットの動作はデータベース/ドライバごとに異なり、使用される結果セットの同時実行性も異なります。 –

+0

400,000レコードすべてが必要ですか?そうでなければ、あなたが本当に必要とするレコードだけを選択するように 'WHERE'節で選択範囲を絞ります。 –

答えて

1

ResultSet自体はバインドされていません。あなたのJVMプロセスとネットワーク機能には限界があります。あなたが可能なResultSetのオプションで遊んしようとする1つのクエリからたくさんのレコードを処理する必要がある場合:データベースおよび/またはドライバベンダーに基づいて

Statement stmt = con.createStatement("select * from dual", ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); 
stmt.setFetchSize(1000); 

、それらはあなたがより速くより少ないメモリフットプリントとのリクエストを処理する助けることができます。

+0

フェッチサイズを大きく設定する方が高速ですが、メモリの占有量が増えます。メモリとDBの往復間のトレードオフです。 –

+0

@AdrianShumよく、一部のドライバでは、リクエストされたデータセットをより小さな部分に分割し、一度に全結果セットをプッシュする代わりに1つずつ送るようにトリガすることがあります。しかし、私はあなたに同意する、フェッチサイズは賢明に選択する必要があります。 – SimY4

+0

まあ、どんな場合でも**大きな**フェッチサイズに設定すると、ドライバーは**小さな**ピースでデータを分割することは想像できません。フェッチサイズの目的は、提供されたレコード数の取得用にバッファを用意するようにドライバに指示することです。それが判明すれば、それは小さくなります。また、一度に多くのものをフェッチすると、ラウンドトリップは削減されますが、より多くのメモリが必要になるというのは、単に常識です。物を小さくすることは往復を減らす方法はありません。 –

関連する問題