W JDBC setFetchSize(int)
Metoda jest bardzo ważna dla wydajności i zarządzania pamięcią w JVM, ponieważ kontroluje liczbę wywołań sieciowych z JVM do bazy danych i odpowiednio ilość pamięci RAM używanej do przetwarzania zestawu wyników.
Z natury rzeczy, jeśli wywoływana jest funkcja setFetchSize(10), a sterownik ją ignoruje, są prawdopodobnie tylko dwie opcje:
- Wypróbuj inny sterownik JDBC, który będzie honorował wskazówkę dotyczącą rozmiaru pobierania.
- Spójrz na właściwości specyficzne dla sterownika w połączeniu (adres URL i/lub mapa właściwości podczas tworzenia instancji połączenia).
ZESTAW WYNIKÓW to liczba wierszy zorganizowanych w bazie danych w odpowiedzi na zapytanie. ZESTAW WIERSZY to fragment wierszy, które są pobierane z ZESTAWU WYNIKÓW na wywołanie z maszyny JVM do bazy danych. wywołania i wynikowa pamięć RAM wymagana do przetwarzania zależą od ustawienia rozmiaru pobierania.
Więc jeśli RESULT-SET ma 100 wierszy, a rozmiar pobierania wynosi 10, będzie 10 wywołań sieciowych w celu pobrania wszystkich danych, używając w dowolnym momencie pamięci RAM około 10*{row-content-size}.
Domyślny rozmiar pobierania to 10, co jest dość małe. W opublikowanym przypadku wydaje się, że sterownik ignoruje ustawienie rozmiaru pobierania, pobierając wszystkie dane w jednym wywołaniu (wymagana duża pamięć RAM, optymalna minimalna liczba połączeń sieciowych).
Co dzieje się pod ResultSet.next()
jest to, że w rzeczywistości nie pobiera jednego wiersza na raz z RESULT-SET. Pobiera to z (lokalnego) ROW-SET i pobiera następny ROW-SET (niewidocznie) z serwera, gdy wyczerpie się na lokalnym kliencie.
Wszystko to zależy od sterownika, ponieważ ustawienie jest tylko „podpowiedzią”, ale w praktyce odkryłem, że tak to działa dla wielu sterowników i baz danych (zweryfikowane w wielu wersjach Oracle, DB2 i MySQL).