2016-04-25 9 views
2

Ich möchte alle Zeilen einer großen Tabelle von PostgreSQL in Java lesen. Ich verarbeite die Zeilen nacheinander in der Java-Software.Irgendein Nachteil zum Lesen mit einem Cursor in Java PostgreSQL?

Standardmäßig liest der JDBC PostgreSQL-Treiber alle Zeilen in den Speicher, dh mein Programm hat nicht genügend Arbeitsspeicher.

Die documentation spricht von "Ergebnisse basierend auf einem Cursor" mit st.setFetchSize(50); Ich habe das implementiert und es funktioniert gut.

Gibt es einen Nachteil für diesen Ansatz? Wenn nicht, würde ich es für alle unsere großen und kleinen Anfragen aktivieren, oder ist das eine schlechte Idee?

Antwort

0

Nun, wenn Sie eine Fetchgröße von 50 haben und Sie erhalten 1000 Ergebnisse, wird es in 20 Rundreisen zur Datenbank führen. Also nein, es ist keine gute Idee, es blind zu aktivieren, ohne an die tatsächlichen Abfragen zu denken.

Eine größere Frage ist, warum sind Ihre ResultSets so groß, dass Sie keinen Speicher mehr haben. Laden Sie nur Daten, die Sie verwenden werden, und Sie haben nur wenig Speicher, oder gibt es möglicherweise schlecht entworfene Abfragen, die übermäßige Ergebnisse liefern.

+0

Ich kenne das postgresql-Protokoll nicht, aber es ist durchaus möglich, dass die anfängliche Pufferung, wenn nicht die fetchsize angegeben wird, trotzdem zu _n_ roundtrips führen kann, da diese Zeilen noch kleiner sein müssen auch größer die Anzahl der Roundtrips, wenn Sie eine Abrufgröße angeben). Der Unterschied liegt darin, dass diese Kosten im Vordergrund stehen und nicht alle 50 Elemente während der Iteration. –

+0

Wir indexieren eine ganze Tabelle von 1M Einträgen in Lucene. Also machen wir im Prinzip 'SELECT * FROM my_table' und verarbeiten dann die Ergebnisse nacheinander. Dauert nur ein paar Minuten, also funktioniert es gut. Aber sie einzeln (oder zumindest in Stapeln) zu verarbeiten, macht viel mehr Sinn, als sie alle in den RAM zu laden und sie dann einzeln zu verarbeiten. –

+0

@MarkRotteveel Scheint wie auf der Leitung der Treiber sendet nur "0" als Zeilenlimit, wenn Fetchgröße oder Grenze nicht festgelegt wurde. Ich würde mir vorstellen, dass es dazu führen würde, mehr als 50 Reihen auf einmal zu holen, aber ich werde jetzt nicht weiter darauf eingehen. – Kayaman

Verwandte Themen