sql >> Databáze >  >> RDS >> Sqlserver

Co metoda Statement.setFetchSize(nSize) skutečně dělá v ovladači SQL Server JDBC?

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:

  1. Vyzkoušejte jiný ovladač JDBC, který bude respektovat nápovědu velikosti načtení.
  2. 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).



  1. Kolekce Oracle PL/SQL – Vytvořte vnořenou tabulku v databázi

  2. org.postgresql.util.PSQLException:Velké objekty nelze použít v režimu automatického potvrzení

  3. Přirozené řazení v MySQL

  4. Jak CAST() funguje v SQL Server