I JDBC er setFetchSize(int)
metoden er meget vigtig for ydeevne og hukommelsesstyring i JVM'en, da den styrer antallet af netværksopkald fra JVM'en til databasen og tilsvarende mængden af RAM, der bruges til ResultSet-behandling.
Hvis setFetchSize(10) kaldes, og driveren ignorerer det, er der sandsynligvis kun to muligheder:
- Prøv en anden JDBC-driver, der overholder tippet om hentning af størrelse.
- Se på driverspecifikke egenskaber på forbindelsen (URL og/eller egenskabskort, når du opretter forbindelsesforekomsten).
RESULTAT-SETT er antallet af rækker, der er rangeret på DB som svar på forespørgslen. ROW-SET er den del af rækker, der hentes ud af RESULT-SET pr. opkald fra JVM til DB. Antallet af disse opkald og resulterende RAM, der kræves til behandling, afhænger af indstillingen for hentestørrelse.
Så hvis RESULTAT-SET har 100 rækker og hente-størrelsen er 10, vil der være 10 netværksopkald til at hente alle data, ved at bruge ca. 10*{row-content-size} RAM på et givet tidspunkt.
Standard-hentningsstørrelsen er 10, hvilket er ret lille. I det nævnte tilfælde ser det ud til, at driveren ignorerer hentestørrelsesindstillingen og henter alle data i et opkald (stort RAM-krav, optimalt minimalt netværksopkald).
Hvad sker der under ResultSet.next()
er, at den faktisk ikke henter en række ad gangen fra RESULTAT-SET. Det henter det fra det (lokale) ROW-SET og henter det næste ROW-SET (usynligt) fra serveren, efterhånden som det bliver udtømt på den lokale klient.
Alt dette afhænger af driveren, da indstillingen kun er et 'tip', men i praksis har jeg fundet ud af, at det er sådan, det fungerer for mange drivere og databaser (verificeret i mange versioner af Oracle, DB2 og MySQL).