Próbuję wykonać zapytanie postgresql która zwraca dużą wynik:JDBC + duży zapytań PostgreSQL rozdawać pamięci
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();
ale ten zużywa dużo pamięci:
Free memory; 4094347680 (= 3905 mb).
start query
done query
Free memory; 2051038576 (= 1956 mb).
(wydrukowano za pomocą Runtime.getRuntime(). freeMemory())
Do tej pory działa, ale baza danych będzie dużo większa. Nigdy nie potrzebuję całego wyniku w pamięci; Potrzebuję tylko przetworzyć każdy wiersz, zapisać wyniki na dysku i przejść do następnego wiersza.
Wiem, że "setFetchSize" jest tylko podpowiedź, ale byłoby dziwne, gdyby postgresql/jdbc zignorował go, jak to jest przez wieki.
Jakikolwiek sposób obejścia tego? Jedynym moim dotychczasowym pomysłem jest utworzenie skryptu wsadowego przesyłającego wynik zapytania do dysku, a następnie przeanalizowanie pliku z Java ...
Po prostu ciekawy, jaki jest maksymalny rozmiar sterty, z którego korzystasz? Czy używasz domyślnie? –
To jest -Xmx4096M-Xms4096M, jest to maszyna o rozmiarze 8 GB. – kresjer