2013-04-26 14 views
6

Ich habe diesen Fehler beim Versuch, große Abfrage zu tun, erhalten.Nicht genügend Speicher bei einer großen Abfrage?

java.lang.OutOfMemoryError: Java heap space 

Ich habe gesucht und gefunden, dass setAutoCommit (false) und setFetchSize Methoden auf meine vorbereitete Anweisung anwenden könnte Umgang mit großer Abfrage helfen. Wenn ich es jedoch verwendet habe, habe ich diesen Fehler erhalten.

Was ist die richtige und einfache Möglichkeit, große Abfrage zu behandeln?

Was ist der richtige Weg, um setFetchSize zu verwenden?

+0

Es wäre einfacher, mit Beispielcode zu beraten. Die häufigste Antwort auf diese Art von Sache ist jedoch, die Abfrage in mehr managable Brocken zu brechen. Brauchen Sie wirklich alle diese Daten auf einmal? –

+0

Wie viele Zeilen erhalten Sie, wenn Sie die gleiche Abfrage in der 'SQL' Konsole ausführen, versuchen Sie auch,' heap_size' für Java zu erhöhen – Akash

+0

mögliches Duplikat von [Streaming großer Ergebnismengen mit MySQL] (http://stackoverflow.com/questions/ 2447324/streaming-large-result-sets-with-mysql) – RandomSeed

Antwort

4

Vorausgesetzt, dass Sie die Connector/J-Treiber verwenden die von MySQL zur Verfügung gestellt, ich glaube, die Lösung in this manual page (Hinweis Parameter 1 Connection::createStatement()) gefunden wird:

Wenn Sie mit Resultsets arbeiten, die eine große Anzahl von Zeilen oder große Werte, und kann nicht zuordnen Heap-Speicher in Ihrer JVM für den Speicher erforderlich, können Sie den Treiber die Ergebnisse streamen zurück eine Zeile zu einer Zeit.

diese Funktionalität zu aktivieren, eine Erklärung Beispiel auf folgende Weise erstellen:

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

Kann setFetchSize mit vorbereiteter Anweisung verwendet werden? –

+0

Da 'public interface PreparedStatement extends Statement' ist, nehme ich an, dass es das ist. Ebenso würde ich die Methode 'Connection :: prepareStatement (String sql, int resultSetType, int resultSetConcurrency) verwenden, um ein solches' PreparedStatement' zu erstellen. – RandomSeed

0

vielleicht einen faulen Suche, ziehen zum Beispiel nur IDs oder dann etwas, wenn Sie verwenden möchten,/zeigen Sie Ihre Daten eine Abfrage nur auf dieser einen ID durchführen?

oder vielleicht statt es in einem Thread laufen, so dass es aus nur geht und tut es im Hintergrund

Verwandte Themen