2013-04-26 21 views
6

大きな質問をするときにこのエラーが発生しました。大きなクエリを実行するとメモリが不足していますか?

java.lang.OutOfMemoryError: Java heap space 

私は検索し、私のプリペアドステートメントに方法にsetAutoCommit(false)をsetFetchSizeメソッドを適用すると、大きなクエリを処理するに役立つかもしれないことを発見しました。 しかし、私が使用したとき、私はこのエラーを受け取りました。

java.sql.SQLException: Illegal value for setFetchDirection(). 

大規模なクエリを処理する適切かつ簡単な方法は何ですか?

setFetchSizeを使用する適切な方法は何ですか?

+0

サンプルコードで助言する方が簡単です。この種の問題に対する最も一般的な答えは、クエリをより管理しやすい塊に分割することです。一度にすべてのデータを本当に必要としていますか? –

+0

'SQL'コンソールで同じクエリを実行しているときにいくつの行を取得するのですか?また、javaの' heap_size'を増やしてみてください。 – Akash

+0

[MySQLで大きな結果セットをストリーミングする](http://stackoverflow.com/questions/ 2447324/streaming-large-result-sets-with-mysql) – RandomSeed

答えて

4

はMySQLが提供するConnector/Jドライバを使用していると仮定すると、私は解決策がthis manual page(通知パラメータConnection::createStatement()の1)で発見されたと信じて:あなたは、行の数が多いのResultSetを使用している場合

または 大きな値があり、メモリが必要な場合は、ドライバに結果を の行に一度にストリーミングするように指示することができ、 メモリのJVMにヒープ領域を割り当てることはできません。

、この機能を有効に次のように文のインスタンスを作成するには:

stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, 
       java.sql.ResultSet.CONCUR_READ_ONLY); 
stmt.setFetchSize(Integer.MIN_VALUE); 
+0

プリペアドステートメントでsetFetchSizeを使用できますか? –

+0

'public interface PreparedStatement extends Statement'のため、それはそうです。同様に、 'Connection :: prepareStatement(String sql、int resultSetType、int resultSetConcurrency) 'というメソッドを使って、このような' PreparedStatement'を作成することも考えます。 – RandomSeed

0

は多分怠惰な検索を行う、例えば、単にIDのか何か、使用したいときに/あなたのデータを表示を引きますperfromはそのIDのクエリだけですか?

スレッド内で実行して、バックグラウンドで実行するようにしてください。