Den korte version er, kald stmt.setFetchSize(50);
og conn.setAutoCommit(false);
for at undgå at læse hele ResultSet
i hukommelsen.
Her er, hvad lægerne siger:
Få resultater baseret på en markør
Som standard samler driveren alle resultaterne for forespørgslen på én gang. Dette kan være ubelejligt for store datasæt, så JDBC-driveren giver mulighed for at basere et resultatsæt på en databasemarkør og kun hente et lille antal rækker.
Et lille antal rækker cachelagres på klientsiden af forbindelsen, og når den er opbrugt, hentes den næste blok af rækker ved at flytte markøren.
Bemærk:
-
Markørbaserede resultatsæt kan ikke bruges i alle situationer. Der er en række begrænsninger, som vil få driveren til lydløst at falde tilbage til at hente hele ResultSet på én gang.
-
Forbindelsen til serveren skal bruge V3-protokollen. Dette er standard for (og understøttes kun af) serverversioner 7.4 og nyere.-
-
Forbindelsen må ikke være i autocommit-tilstand. Backend lukker markører ved slutningen af transaktioner, så i autocommit-tilstand vil backend have lukket markøren, før noget kan hentes fra den.-
-
Statementet skal oprettes med en ResultSet-type af ResultSet.TYPE_FORWARD_ONLY. Dette er standard, så ingen kode skal omskrives for at drage fordel af dette, men det betyder også, at du ikke kan scrolle baglæns eller på anden måde hoppe rundt i resultatsættet.-
-
Den angivne forespørgsel skal være et enkelt udsagn, ikke flere udsagn sat sammen med semikolon.
Eksempel 5.2. Indstilling af hentestørrelse for at slå markører til og fra.
Ændring af kode til markørtilstand er lige så simpelt som at indstille hentestørrelsen for erklæringen til den passende størrelse. Indstilling af hentestørrelsen tilbage til 0 vil medføre, at alle rækker cachelagres (standardadfærden).
// make sure autocommit is off
conn.setAutoCommit(false);
Statement st = conn.createStatement();
// Turn use of the cursor on.
st.setFetchSize(50);
ResultSet rs = st.executeQuery("SELECT * FROM mytable");
while (rs.next()) {
System.out.print("a row was returned.");
}
rs.close();
// Turn the cursor off.
st.setFetchSize(0);
rs = st.executeQuery("SELECT * FROM mytable");
while (rs.next()) {
System.out.print("many rows were returned.");
}
rs.close();
// Close the statement.
st.close();