Krátká verze je, volejte stmt.setFetchSize(50);
a conn.setAutoCommit(false);
abyste se vyhnuli čtení celé ResultSet
do paměti.
Zde je to, co říkají dokumenty:
Získávání výsledků na základě kurzoru
Ve výchozím nastavení ovladač shromažďuje všechny výsledky pro dotaz najednou. To může být nepohodlné pro velké datové sady, takže ovladač JDBC poskytuje prostředek pro založení ResultSet na databázovém kurzoru a načtení pouze malého počtu řádků.
Malý počet řádků je uložen do mezipaměti na klientské straně připojení a po vyčerpání je načten další blok řádků přemístěním kurzoru.
Poznámka:
Sady výsledků založené na kurzoru nelze použít ve všech situacích. Existuje řada omezení, díky nimž se ovladač tiše vrátí k načtení celé sady ResultSet najednou.
Připojení k serveru musí být pomocí protokolu V3. Toto je výchozí (a je podporováno pouze) servery verze 7.4 a novější.-
Připojení nesmí být v režimu automatického potvrzení. Backend zavírá kurzory na konci transakcí, takže v režimu autocommit backend zavře kurzor předtím, než z něj bude možné cokoliv získat.-
Výpis musí být vytvořen s typem ResultSet ResultSet.TYPE_FORWARD_ONLY. Toto je výchozí nastavení, takže nebude potřeba přepisovat žádný kód, abyste toho využili, ale také to znamená, že nemůžete rolovat dozadu nebo jinak přeskakovat v sadě výsledků.-
Zadaný dotaz musí být jeden příkaz, nikoli více příkazů spojených středníky.
Příklad 5.2. Nastavení velikosti načtení pro zapnutí a vypnutí kurzorů.
Změna kódu na režim kurzoru je stejně jednoduchá jako nastavení velikosti načtení příkazu na vhodnou velikost. Nastavení velikosti načtení zpět na 0 způsobí, že všechny řádky budou uloženy do mezipaměti (výchozí chování).
// 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();