2016-10-12 7 views
0

私は数百万のレコードを持つテーブルを持つデータベースを持っています。私はspring jpaを使用してデータベースにアクセスしています。今私はそのテーブル上でfindAll()を使用しようとすると、メモリエラーが発生しています。そのテーブルのサイズは約150MBです。私はjvmに1GBのヒープを与えました。私の質問は、ヒープメモリを消費する理由です。 これが正しい方法でない場合は、ページネーションとガベージコレクタを呼び出す必要があります。Javaで巨大なdbテーブルを読む最良の方法

答えて

1

一度にすべてのレコードを取得しないで、すべての値をチャンク内で取得すると、メモリ不足の問題が解消されます。 Spring-data- *モジュールは、あなたが効果的にそれを行うのに役立ちます。パラメータとしてページを渡してデータを取得できます。

達成するサンプルはfindAllです。これはパラメータとしてページング可能なページを返します。

+0

私はこの方法でガベージコレクタを明示的に呼び出す必要がありますか? – user2784095

+0

いいえ、私たちのメモリが大幅に増えていないので、jvmが処理します – rajadilipkolli

0

バネデータモジュールは、ページネーションを使用して大きな結果セットを処理する簡単な方法です。
時間単位で結果セットのチャンクだけを表示する必要がある場合は、春のページネーションで十分です。

あなたは、全体の結果セット(tipicallyログテーブル)を表示する必要がある場合よりも次のことができます。CursoredStream(EclipseLinkは)のような

  • 使用JPAのベンダーの機能
  • 使用JDBC ResultSet

この機能を使用すると、クエリを実行し、その結果をIteratorのように使用することができます(多かれ少なかれ)。
定義したfetchSizeに基づいて、結果セットのスクロール中にjvmメモリーが少しずつロードされます。
このメソッドを使用すると、すでにクライアントに送信されたレコードを破棄し、最新のメモリのみを維持することができます。

関連する問題