Estoy tratando de ejecutar una consulta PostgreSQL, que devuelve un resultado grande:JDBC + amplia consulta PostgreSQL dan fuera de la memoria
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();
pero esto consume mucha memoria:
Free memory; 4094347680 (= 3905 mb).
start query
done query
Free memory; 2051038576 (= 1956 mb).
(impreso con Runtime.getRuntime(). freeMemory())
Hasta ahora funciona, pero la base de datos va a ser mucho más grande. No necesito el resultado completo en la memoria; Solo necesito procesar cada fila, escribir los resultados en el disco y pasar a la siguiente fila.
Sé que 'setFetchSize' es solo una sugerencia, pero me resultaría extraño si postgresql/jdbc lo ignorara, ya que existe desde hace mucho tiempo.
¿Alguna forma de evitar esto? Mi única idea hasta ahora es hacer un script por lotes que transmita el resultado de la consulta al disco y luego analizar el archivo desde Java ...
Simplemente curioso, ¿cuál es el tamaño máximo de almacenamiento dinámico con el que se está ejecutando? ¿O estás usando el valor predeterminado? –
Es -Xmx4096M -Xms4096M, es una máquina de vista de 8GB. – kresjer