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?
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. –
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. –
@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