Java JDBC ignoriert setFetchSize?

8

Ich verwende den folgenden Code

%Vor%

Die Abfrage gibt viele (800k) Zeilen zurück und es dauert sehr lange (~ 2m) zwischen dem Ausdruck "start query" und "done query". Wenn ich manuell eine "Grenze 10000" in meine Abfrage einfüge, gibt es keine Zeit zwischen "start" und "done". Die Verarbeitung der Ergebnisse benötigt Zeit, ich denke also, es ist insgesamt schneller, wenn es nur 1k Zeilen aus der Datenbank holt, diese verarbeitet und wenn es keine Zeilen mehr hat, kann es neue im Hintergrund bekommen.

Der ResultsSet.CONCUR_READ_ONLY usw. wo meine letzte Schätzung; vermisse ich etwas?

(es ist ein postgresql 8.3 Server)

    
kresjer 23.09.2009, 19:12
quelle

4 Antworten

20

Versuchen Sie, die automatische Festschreibung zu deaktivieren:

%Vor%

Referenz

    
dogbane 23.09.2009 19:36
quelle
3

Die beiden Abfragen machen ganz andere Dinge.

Mit der LIMIT -Klausel wird die Größe der Ergebnismenge auf 10000 begrenzt, während die Abrufgröße nicht festgelegt wird, sondern stattdessen dem Treiber ein Hinweis gegeben wird, wie viele Zeilen gleichzeitig abgerufen werden sollen die Ergebnismenge - die alle 800k Zeilen enthält.

Wenn also setFetchSize verwendet wird, erstellt die Datenbank die vollständige Ergebnismenge, deshalb dauert es so lange.

Zur besseren Übersicht bearbeiten: Das Setzen der Abrufgröße bewirkt nichts, wenn Sie nicht durch das Ergebnis iterieren (siehe Jons Kommentar), aber das Erstellen eines viel kleineren Ergebnissatzes über LIMIT macht einen großen Unterschied.

    
Henning 23.09.2009 20:05
quelle
2

Dies hängt von Ihrem Treiber ab. Aus der Dokumentation:

  

Gibt dem JDBC-Treiber einen Hinweis auf die   Anzahl der Zeilen, die abgerufen werden sollen   aus der Datenbank, wenn mehr Zeilen sind   erforderlich. Die Anzahl der angegebenen Zeilen   betrifft nur Ergebnismengen, die mit erstellt wurden   diese Aussage. Wenn der Wert angegeben ist   ist Null, dann wird der Hinweis ignoriert. Das   Standardwert ist Null.

Beachten Sie, dass hier "ein Hinweis" steht - ich würde damit meinen, dass ein Fahrer den Hinweis ignorieren kann, wenn er es wirklich möchte ... und es klingt, als ob das passiert.

    
Jon Skeet 23.09.2009 19:16
quelle
2

Ich habe festgestellt, dass Ihre Verwendung der API anders ist als die von Javadoc:

Übergeben Sie die Parameter in dieser Reihenfolge.

%Vor%     
Wishper 06.03.2012 11:32
quelle

Tags und Links