Je suis en train d'exécuter une requête postgresql qui renvoie un grand résultat:jdbc + grande requête postgresql donnent de mémoire
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();
mais utilise beaucoup de mémoire:
Free memory; 4094347680 (= 3905 mb).
start query
done query
Free memory; 2051038576 (= 1956 mb).
(imprimé avec Runtime.getRuntime(). freeMemory())
Jusqu'à présent cela fonctionne mais la base de données va être beaucoup plus grande. Je n'ai jamais besoin du résultat entier en mémoire; J'ai juste besoin de traiter chaque ligne, écrire les résultats sur le disque et aller à la rangée suivante. Je sais que 'setFetchSize' est seulement un indice, mais je trouverais étrange que postgresql/jdbc l'ignore, car il existe depuis des lustres.
Un moyen de le contourner? Ma seule idée jusqu'ici est de faire un script batch qui transmet le résultat de la requête sur le disque, puis analyser le fichier à partir de Java ...
Juste curieux, quelle est la taille maximale de tas que vous utilisez? Ou utilisez-vous par défaut? –
C'est -Xmx4096M -Xms4096M, c'est une machine Vista de 8 Go. – kresjer