Samo ustawienie rozmiaru pobierania nie jest właściwym podejściem. javadoc Statement#setFetchSize()
już stwierdza, co następuje:
Daje sterownikowi JDBC podpowiedź ile wierszy należy pobrać z bazy danych
Kierowca może w rzeczywistości zastosować lub zignorować podpowiedź. Niektórzy kierowcy to ignorują, niektórzy stosują go bezpośrednio, niektórzy potrzebują więcej parametrów. Sterownik MySQL JDBC należy do ostatniej kategorii. Jeśli sprawdzisz sterownik MySQL JDBC dokumentacja , zobaczysz następujące informacje (przewiń o 2/3 w dół do nagłówka ResultSet ):
Aby włączyć tę funkcję, musisz utworzyć instancję Statement w następujący sposób:
stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(Integer.MIN_VALUE);
Przeczytaj całość części dokumentu, opisuje również zastrzeżenia tego podejścia. Oto odpowiedni cytat:
W tym podejściu są pewne zastrzeżenia. Będziesz musiał przeczytać wszystkie wiersze w zestawie wyników (lub je zamknąć), zanim będziesz mógł wysyłać jakiekolwiek inne zapytania dotyczące połączenia, w przeciwnym razie zostanie zgłoszony wyjątek.
(...)
Jeśli wyciąg znajduje się w zakresie transakcji, blokady są zwalniane po zakończeniu transakcji (co oznacza, że wyciąg musi zostać ukończony jako pierwszy). Podobnie jak w przypadku większości innych baz danych, zestawienia nie są kompletne, dopóki wszystkie wyniki oczekujące na zestawienie nie zostaną odczytane lub aktywny zestaw wyników dla zestawienia nie zostanie zamknięty.
Jeśli to nie naprawi OutOfMemoryError
(nie Exception
), prawdopodobnie problem polega na tym, że przechowujesz wszystkie dane w pamięci Java zamiast przetwarzać je natychmiast jak tylko pojawią się dane. Wymagałoby to dalszych zmian w kodzie, być może całkowitego przepisania. Odpowiedziałem na podobne pytanie przed tutaj .