2009-06-02 36 views
1

大量のデータを取得するためにJDBCを使用しています。呼び出しが正常に完了したが、resultSet.next()が呼び出されたときに、私は次のエラーを取得する:メモリ不足allocLargeObjectOrArray from ResultSet

java.lang.OutOfMemoryError: allocLargeObjectOrArray - Object size: 15414016, Num elements: 7706998 

私は、JVMのメモリーサイズを大きくしようとしましたが、これは問題を解決していません。 JDBCを使用してデータベースにアクセスするのではなく、システムがJDBCを使用してBEA AquaLogicサービスにアクセスしているので、この問題に対処できるかどうかはわかりません。

誰もこのエラーに遭遇しましたか?

+0

さらに完全なスタックトレースを投稿できますか? – Gandalf

+0

データベースから何を読み込もうとしていますか? –

答えて

1

最初のresultSet.next()を呼び出すまで、結果はまだデータベースから読み込まれていない場合も、どこか別のキャッシュ構造に残っている可能性があることに注意してください。

すべてのデータが必要な場合は、残った結果がなくなるまで結果を返すように選択を制限してください。

JDBCコールによって返されるデータ量に絶対制限があることを確認できない限り、JVMメモリサイズを増やすことは役に立ちません。

さらに、JDBCを介して任意のサービスにアクセスすると、基本的に使用しているJDBCドライバのバグが存在することが考えられJDBC :)

別(そう)可能性を使用してに集約します。可能であれば、別の実装を試して、問題が解決されないかどうかを確認してください。

+0

私はJDBCドライバが原因であるとは思わないでしょう。ただし、これはBEA固有のものなので、他の実装を試すことはできません。私が探している情報を得るには他の方法もありますが、現時点では大きなバックステップになるでしょう。 – Nick

+1

私は本当に問題を把握する時間がありませんでした。その間、私はエラーなしでデータを返すことができるようです。とにかく私のケースは最悪のケースだと私は信じています。 最も堅牢であるため、この回答を受け入れます。 – Nick

0

ステートメントでsetFetchSize(int行)メソッドを設定できます。
しかし、setFetchRowsはヒントのみであり、実装されていない可能性があります。

+1

これは、1つの行だけが返されるため、機能しません。 – Nick

0

メモリサイズを1.2gに拡大してみてください。 -mx1200mまたはあなたのマシンの物理メモリより少し小さいもの。すぐにあなたの考えるよりも多くのデータを読んでいるかもしれません。

+1

これまでのところ私はJVMがアプリケーションを起動しないようにメモリを増やしました。私のマシンはあまりにも強くない。 – Nick

1

まず、一度に多くのデータをメモリに保存する必要があるかどうかを確認します。 RDBMSは大きなデータセットを集約/ソートするなどの点で優れているので、可能であれば、それを活用するようにしてください。

もしそうでなければ(何らかの理由で実際に多くのデータが作業メモリに必要です)...そしてJVMのメモリargsをバンプしてもバーを十分に上げることはできません。 Coherence(COTS)やTerraCotta(オープンソース)のような分散キャッシングソリューション。

0

データベースから戻ってきた行はいくつですか? kosi2801のように、データのサブセットを取得し、妥当な数で開始し、次にしきい値を見つけるために増加させることを提案します。