Krótka wersja to, wywołaj stmt.setFetchSize(50);
i conn.setAutoCommit(false);
aby uniknąć czytania całego ResultSet
do pamięci.
Oto, co mówią dokumenty:
Uzyskiwanie wyników na podstawie kursora
Domyślnie sterownik zbiera wszystkie wyniki zapytania jednocześnie. Może to być niewygodne w przypadku dużych zestawów danych, dlatego sterownik JDBC umożliwia oparcie zestawu wyników na kursorze bazy danych i pobranie tylko niewielkiej liczby wierszy.
Niewielka liczba wierszy jest buforowana po stronie klienta połączenia, a po wyczerpaniu następny blok wierszy jest pobierany przez zmianę pozycji kursora.
Uwaga:
-
Zestawy wyników oparte na kursorze nie mogą być używane we wszystkich sytuacjach. Istnieje szereg ograniczeń, które spowodują, że kierowca po cichu powróci do pobrania całego zestawu wyników za jednym razem.
-
Połączenie z serwerem musi korzystać z protokołu V3. Jest to ustawienie domyślne (i obsługiwane tylko przez) serwer w wersji 7.4 i nowszych.-
-
Połączenie nie może być w trybie automatycznego zatwierdzania. Backend zamyka kursory na końcu transakcji, więc w trybie automatycznego zatwierdzania backend zamknie kursor, zanim cokolwiek będzie można z niego pobrać.-
-
Instrukcja musi być utworzona z typem ResultSet o typie ResultSet.TYPE_FORWARD_ONLY. Jest to ustawienie domyślne, więc żaden kod nie będzie musiał być przepisany, aby z tego skorzystać, ale oznacza to również, że nie można przewijać do tyłu ani w inny sposób przeskakiwać w zestawie wyników.-
-
Podane zapytanie musi być pojedynczą instrukcją, a nie wieloma instrukcjami połączonymi ze średnikami.
Przykład 5.2. Ustawiam rozmiar pobierania, aby włączać i wyłączać kursory.
Zmiana kodu w tryb kursora jest tak prosta, jak ustawienie odpowiedniego rozmiaru pobieranej instrukcji. Ustawienie rozmiaru pobierania z powrotem na 0 spowoduje, że wszystkie wiersze będą buforowane (zachowanie domyślne).
// 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();