Den korta versionen är, anrop stmt.setFetchSize(50);
och conn.setAutoCommit(false);
för att undvika att läsa hela ResultSet
i minnet.
Så här säger läkarna:
Få resultat baserat på en markör
Som standard samlar drivrutinen alla resultat för frågan på en gång. Detta kan vara obekvämt för stora datamängder, så JDBC-drivrutinen tillhandahåller ett sätt att basera en resultatuppsättning på en databasmarkör och bara hämta ett litet antal rader.
Ett litet antal rader cachelagras på klientsidan av anslutningen och när det är slut hämtas nästa block med rader genom att flytta markören.
Obs:
Markörbaserade resultatuppsättningar kan inte användas i alla situationer. Det finns ett antal begränsningar som gör att föraren tyst faller tillbaka till att hämta hela ResultSet på en gång.
Anslutningen till servern måste använda V3-protokollet. Detta är standard för (och stöds endast av) serverversioner 7.4 och senare.-
Anslutningen får inte vara i autocommit-läge. Backend stänger markörer i slutet av transaktioner, så i autocommit-läge kommer backend att ha stängt markören innan något kan hämtas från den.-
Utlåtandet måste skapas med en ResultSet-typ av ResultSet.TYPE_FORWARD_ONLY. Detta är standard, så ingen kod behöver skrivas om för att dra nytta av detta, men det betyder också att du inte kan scrolla bakåt eller på annat sätt hoppa runt i resultatuppsättningen.-
Den givna frågan måste vara en enskild sats, inte flera satser sammansatta med semikolon.
Exempel 5.2. Ställer in hämtningsstorlek för att aktivera och inaktivera markörer.
Att ändra koden till markörläge är lika enkelt som att ställa in hämtningsstorleken för uttalandet till lämplig storlek. Om du ställer tillbaka hämtningsstorleken till 0 kommer alla rader att cachelagras (standardbeteendet).
// 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();