の外に与える私は大きな結果を返すPostgreSQLのクエリを実行しようとしています:JDBC +大PostgreSQLのクエリは、メモリ
connection.setAutoCommit(false);
st = connection.createStatement(
ResultSet.CONCUR_READ_ONLY,
ResultSet.TYPE_FORWARD_ONLY
);
st.setFetchSize(100);
logMemory();
System.out.println("start query ");
rs = st.executeQuery(queryString);
System.out.println("done query ");
logMemory();
をしかし、これは多くのメモリを使用する:
Free memory; 4094347680 (= 3905 mb).
start query
done query
Free memory; 2051038576 (= 1956 mb).
( Runtime.getRuntime()。freeMemory())
これまでのところ動作しますが、データベースはもっと大きくなるでしょう。私は記憶の中で結果全体を必要とすることはありません。私はちょうど各行を処理し、ディスクに結果を書いて、次の行に行く必要があります。
私は 'setFetchSize'はほんのヒントだと知っていますが、postgresql/jdbcがそれを無視するならば、それは奇妙なものです。
これを回避する方法はありますか?これまでの私の唯一のアイデアは、クエリの結果をディスクにストリームしてJavaからファイルを解析するバッチスクリプトを作成することです...
好奇心が強い、あなたが実行している最大ヒープサイズは?または、デフォルトを使用していますか? –
-Xmx4096M -Xms4096M、それはVistaの8GBマシンです。 – kresjer