I JDBC, setFetchSize(int)
Metoden är mycket viktig för prestanda och minneshantering inom JVM eftersom den styr antalet nätverksanrop från JVM till databasen och på motsvarande sätt mängden RAM som används för ResultSet-bearbetning.
Om setFetchSize(10) anropas och drivrutinen ignorerar det, finns det förmodligen bara två alternativ:
- Testa en annan JDBC-drivrutin som följer tipset om hämtningsstorlek.
- Titta på drivrutinsspecifika egenskaper på anslutningen (URL och/eller egenskapskartan när man skapar anslutningsinstansen).
RESULTAT-SET är antalet rader som är sorterade på DB som svar på frågan. ROW-SET är den bit av rader som hämtas ut från RESULT-SET per anrop från JVM till DB. Antalet av dessa anrop och resulterande RAM som krävs för bearbetning beror på inställningen för hämtningsstorlek.
Så om RESULTAT-SET har 100 rader och hämtningsstorleken är 10, kommer det att finnas 10 nätverksanrop för att hämta all data, med ungefär 10*{row-content-size} RAM vid varje given tidpunkt.
Den förinställda hämtningsstorleken är 10, vilket är ganska litet. I det aktuella fallet verkar det som att föraren ignorerar inställningen för hämtningsstorlek och hämtar all data i ett samtal (stort RAM-krav, optimalt minimalt nätverksanrop).
Vad händer under ResultSet.next()
är att den faktiskt inte hämtar en rad åt gången från RESULTAT-SET. Den hämtar det från den (lokala) ROW-SET och hämtar nästa ROW-SET (osynligt) från servern när den blir uttömd på den lokala klienten.
Allt detta beror på drivrutinen eftersom inställningen bara är ett "tips" men i praktiken har jag funnit att det är så det fungerar för många drivrutiner och databaser (verifierat i många versioner av Oracle, DB2 och MySQL).