Att bara ställa in hämtningsstorleken är inte rätt tillvägagångssätt. javadoc för Statement#setFetchSize()
anger redan följande:
Ger JDBC-drivrutinen ett tips om antalet rader som ska hämtas från databasen
Föraren är faktiskt fri att tillämpa eller ignorera tipset. Vissa förare ignorerar det, vissa förare tillämpar det direkt, vissa förare behöver fler parametrar. MySQL JDBC-drivrutinen hamnar i den sista kategorin. Om du kontrollerar MySQL JDBC-drivrutinen dokumentation , kommer du att se följande information (rulla cirka 2/3 nedåt tills rubriken ResultSet ):
För att aktivera den här funktionen måste du skapa en Statement-instans på följande sätt:
stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY); stmt.setFetchSize(Integer.MIN_VALUE);
Vänligen läs hela avsnittet i dokumentet, beskriver det även förbehållen för detta tillvägagångssätt. Här är ett relevant citat:
Det finns några varningar med detta tillvägagångssätt. Du måste läsa alla rader i resultatuppsättningen (eller stänga den) innan du kan skicka några andra frågor om anslutningen, annars kommer ett undantag att skapas.
(...)
Om uttalandet är inom ramen för en transaktion, frigörs lås när transaktionen slutförs (vilket innebär att uttalandet måste slutföras först). Som med de flesta andra databaser är inte satser fullständiga förrän alla resultat som väntar på satsen har lästs eller den aktiva resultatuppsättningen för satsen stängs.
Om det inte fixar OutOfMemoryError
(inte Exception
), är problemet troligen att du lagrar all data i Javas minne istället för att bearbeta den omedelbart så fort data kommer in. Detta skulle kräva fler ändringar i din kod, kanske en fullständig omskrivning. Jag har svarat på liknande fråga tidigare här .