2012-03-30 6 views
4

Normalerweise, wenn ich will große Ergebnismenge abfragen Mysql ich dies (aus this answer) schreiben:Mysql-Streaming-Ergebnis gesetzt und jOOQ fetchLazy

stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY); 
stmt.setFetchSize(Integer.MIN_VALUE); 

Jetzt bin ich mit jOOQ 2.0.5 und ich kann‘ t das gleiche Ergebnis erzielen.

Ich habe versucht Aufruf fetchLazy ohne Glück, lädt es das gesamte Ergebnis im Speicher gesetzt:

Cursor<Record> result = query.fetchLazy(Integer.MIN_VALUE); 

Als Abhilfe, die ich die SQL-Abfrage erhalten kann query.getSQL() und erstellen Sie eine geeignetes Statement verwenden, um sie auszuführen.

Gibt es eine andere Möglichkeit, Streams mit jOOQ zu erstellen?

+0

es nie selbst, aber ein schnellen Blick In der Dokumentation wird erwähnt, dass Sie für die zugrunde liegende AnweisungFetchSize() festlegen müssen (obwohl dies den Zweck der Überlagerung zu verhindern scheint ...). – Corbin

Antwort

4

Nach den JDBC-Spezifikationen ist Integer.MIN_VALUE kein gültiges Argument für die Statement.setFetchSize() Methode:

Gibt die JDBC-Treiber einen Hinweis auf die Anzahl der Zeilen, die aus der Datenbank abgerufen werden sollen, wenn mehrere Reihen benötigt für ResultSet-Objekte, die von dieser Anweisung generiert werden. Wenn der angegebene Wert Null ist, wird der Hinweis ignoriert. Der Standardwert ist Null.

Parameter:

Reihen die Anzahl der Zeilen

Werfen zu holen: SQLException - wenn ein Datenbank-Zugriffsfehler auftritt, ist diese Methode auf einem geschlossenen Statement oder die Bedingungszeilen genannt wird> = 0 ist nicht erfüllt.

Implementierungen können eine SQLException für negative Abrufgrößen werfen. Daher akzeptiert jOOQ keine Parameter kleiner als 0. Sie sollten stattdessen eine Abrufgröße von 1 verwenden. In der Zwischenzeit könnte die nächste Version von jOOQ Lage sein, den JDBC-Standard zu brechen, um dies zu unterstützen documented MySQL feature :

https://github.com/jOOQ/jOOQ/issues/1263 (implementiert in jOOQ 2.2.0)

+0

@dusan: Hat das Einstellen der Abrufgröße auf '1' für Sie funktioniert? –

+0

Nein, mit einer Abrufgröße von "1" erhalte ich einen "OutOfMemoryError". Ich beendete schließlich die Verwendung von JDBC. Aber ich werde sicherlich auf die nächste Version von jooq warten :) – dusan

+1

@dusan: Schade, dass MySQL den JDBC-Spezifikationen nicht folgt. Aber das Update wird in einer Woche veröffentlicht werden. [Eine Vorschau ist hier verfügbar] (https://oss.sonatype.org/content/repositories/snapshots/org/jooq/) –