V JDBC, setFetchSize(int)
metoda je velmi důležitá pro výkon a správu paměti v rámci JVM, protože řídí počet síťových volání z JVM do databáze a odpovídajícím způsobem množství paměti RAM použité pro zpracování ResultSet.
Pokud se volá setFetchSize(10) a ovladač to ignoruje, existují pravděpodobně pouze dvě možnosti:
- Vyzkoušejte jiný ovladač JDBC, který bude respektovat nápovědu velikosti načtení.
- Podívejte se na vlastnosti specifické pro ovladač na Connection (URL a/nebo mapa vlastností při vytváření instance Connection).
RESULT-SET je počet řádků zařazených do DB v reakci na dotaz. ROW-SET je blok řádků, které jsou načteny ze RESULT-SET za volání z JVM do DB. Počet těchto volání a výsledná RAM požadovaná pro zpracování závisí na nastavení velikosti načítání.
Pokud má tedy RESULT-SET 100 řádků a velikost načtení je 10, dojde k 10 síťovým voláním k načtení všech dat s využitím zhruba 10*{row-content-size} RAM v daný okamžik.
Výchozí velikost načítání je 10, což je poměrně málo. V uvedeném případě by se zdálo, že ovladač ignoruje nastavení velikosti načítání a získává všechna data v jednom volání (velký požadavek na RAM, optimální minimální síťová volání).
Co se stane pod ResultSet.next()
je, že ve skutečnosti nenačítá jeden řádek po druhém ze RESULT-SET. Načte to z (místního) ROW-SET a načte další ROW-SET (neviditelně) ze serveru, jakmile se vyčerpá na místním klientovi.
To vše závisí na ovladači, protože nastavení je jen 'nápověda', ale v praxi jsem zjistil, že to takhle funguje u mnoha ovladačů a databází (ověřeno v mnoha verzích Oracle, DB2 a MySQL).