1

JDBCを使用して大量のデータを取得しています。呼び出しは正常に完了しますが、resultSet.next()が呼び出されると、次のエラーが発生します。

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

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

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

4

5 に答える 5

1

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

すべてのデータが必要な場合は、適切な量の結果を返すように Select を制限し、結果がなくなるまで呼び出しを繰り返す必要があります。

JDBC 呼び出しによって返されるデータ量に絶対的な制限があることを確認できない限り、JVM メモリ サイズを増やしても効果はありません。

さらに、JDBCを介してサービスにアクセスすることは、本質的にJDBCを使用することになります:)

別の (ありそうもない) 可能性として、使用している JDBC ドライバーにバグがある可能性があります。可能であれば別の実装を試して、問題が解決しないかどうかを確認してください。

于 2009-06-02T17:36:45.500 に答える
1

まず、メモリ内に一度に大量のデータを取得する必要があるかどうかを判断します。RDBMS は、大規模なデータ セットの集約/並べ替えなどに適しているため、可能であればそれを利用するようにしてください。

そうでない場合(そして、実際には、何らかの理由で作業メモリにそれだけの量のデータが必要です)...そしてJVMのメモリ引数を増やしても十分にバーが上がりません...次のようなメモリ内分散キャッシングソリューションを調べてくださいCoherence (COTS) または TerraCotta (オープン ソース)。

于 2009-11-04T04:10:33.953 に答える
0

データベースから何行返されていますか? kosi2801 のように、データのサブセットのみをフェッチし、適切な数から始めて、しきい値を見つけるために増やしていくようお勧めします。

于 2009-11-06T10:40:27.723 に答える
0

-mx1200m など、メモリ サイズを 1.2g に増やしてみてください。思ったよりも多くのデータを一度に読み取っていることに気付くかもしれません。

于 2009-06-16T21:05:24.520 に答える
0

ステートメントに setFetchSize(int rows) メソッドを設定してみてください。
ただし、setFetchRows はヒントにすぎないため、実装されていない可能性があります。

于 2009-06-16T20:55:04.010 に答える