Nur die Abrufgröße festzulegen, ist nicht der richtige Ansatz. Das Javadoc von Statement#setFetchSize()
heißt es bereits:
Gibt dem JDBC-Treiber einen Hinweis bezüglich der Anzahl der Zeilen, die aus der Datenbank geholt werden sollen
Dem Fahrer steht es tatsächlich frei, den Hinweis anzuwenden oder zu ignorieren. Einige Treiber ignorieren es, einige Treiber wenden es direkt an, einige Treiber benötigen mehr Parameter. Der MySQL-JDBC-Treiber fällt in die letzte Kategorie. Wenn Sie den MySQL JDBC-Treiber überprüfen Dokumentation , sehen Sie die folgenden Informationen (etwa 2/3 nach unten scrollen, bis die Überschrift ResultSet ):
Um diese Funktionalität zu aktivieren, müssen Sie auf folgende Weise eine Statement-Instanz erstellen:
stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(Integer.MIN_VALUE);
Bitte gesamt lesen Im Abschnitt des Dokuments werden auch die Vorbehalte dieses Ansatzes beschrieben. Hier ist ein relevantes Zitat:
Bei diesem Ansatz gibt es einige Vorbehalte. Sie müssen alle Zeilen in der Ergebnismenge lesen (oder schließen), bevor Sie andere Abfragen für die Verbindung ausführen können, oder es wird eine Ausnahme ausgelöst.
(...)
Wenn sich die Anweisung im Gültigkeitsbereich einer Transaktion befindet, werden Sperren freigegeben, wenn die Transaktion abgeschlossen ist (was impliziert, dass die Anweisung zuerst abgeschlossen werden muss). Wie bei den meisten anderen Datenbanken sind Anweisungen nicht vollständig, bis alle für die Anweisung anstehenden Ergebnisse gelesen wurden oder die aktive Ergebnismenge für die Anweisung geschlossen wurde.
Wenn das den OutOfMemoryError
nicht behebt (nicht Exception
), liegt das Problem wahrscheinlich darin, dass Sie alle Daten im Speicher von Java speichern, anstatt sie sofort zu verarbeiten sobald die Daten eingehen. Dies würde weitere Änderungen in Ihrem Code erfordern, möglicherweise eine vollständige Neuschreibung. Ich habe ähnliche Fragen zuvor hier .