Sdílet prostřednictvím


Použití adaptivního ukládání do vyrovnávací paměti

Stáhnout ovladač JDBC

Adaptivní ukládání do vyrovnávací paměti je navržené tak, aby načítalo jakýkoli druh velkých dat bez režie kurzorů serveru. Aplikace můžou používat funkci adaptivního ukládání do vyrovnávací paměti se všemi verzemi SQL Serveru, které ovladač podporuje.

Obvykle, když ovladač Microsoft JDBC pro SQL Server spustí dotaz, ovladač načte všechny výsledky ze serveru do paměti aplikace. I když tento přístup minimalizuje spotřebu prostředků na SQL Serveru, může vyvolat OutOfMemoryError v aplikaci JDBC pro dotazy, které vytvářejí velmi velké výsledky.

Aby aplikace mohly zpracovávat velmi velké výsledky, ovladač Microsoft JDBC pro SQL Server poskytuje adaptivní ukládání do vyrovnávací paměti. Při adaptivním ukládání do vyrovnávací paměti ovladač načte výsledky provádění příkazů z SQL Serveru, protože je aplikace potřebuje, a ne najednou. Ovladač také zahodí výsledky, jakmile k nim aplikace nebude mít přístup. Tady je několik příkladů, kde může být adaptivní ukládání do vyrovnávací paměti užitečné:

  • Dotaz vytvoří velmi velkou sadu výsledků: Aplikace může spustit příkaz SELECT, který vytváří více řádků, než může aplikace uložit do paměti. V předchozích verzích musela aplikace použít kurzor serveru, aby se předešlo chybě OutOfMemoryError. Adaptivní ukládání do vyrovnávací paměti umožňuje provádět dopředné čtení výsledkové sady libovolné velikosti bez potřeby serverového kurzoru.

  • Dotaz vytvoří velmi velké sloupce SQLServerResultSetnebo hodnoty parametrů SQLServerCallableStatementOUT: Aplikace může načíst jednu hodnotu (sloupec nebo parametr OUT), která je příliš velká, aby se vešel zcela do paměti aplikace. Adaptivní vyrovnávání umožňuje klientské aplikaci načíst takovou hodnotu jako datový proud pomocí metod getAsciiStream, getBinaryStream nebo getCharacterStream. Aplikace načte hodnotu z SQL Serveru při čtení ze streamu.

Poznámka:

Při adaptivním ukládání do vyrovnávací paměti ovladač JDBC uloží do vyrovnávací paměti pouze množství dat, která má. Ovladač neposkytuje žádnou veřejnou metodu pro řízení nebo omezení velikosti vyrovnávací paměti.

Nastavení adaptivního vyrovnávání paměti

Počínaje ovladačem JDBC verze 2.0 je výchozí chování ovladače adaptivní. Jinými slovy, aby se získalo chování adaptivního ukládání do vyrovnávací paměti, nemusí vaše aplikace explicitně požadovat adaptivní chování. Ve verzi 1.2 však režim ukládání do vyrovnávací paměti byl ve výchozím nastavení "plný" a aplikace musela explicitně požádat o režim adaptivního ukládání do vyrovnávací paměti.

Aplikace může třemi způsoby požádat, aby provádění příkazu používalo adaptivní vyrovnávání:

Při použití ovladače JDBC verze 1.2 bylo potřeba, aby aplikace přetypovaly objekt příkazu na třídu SQLServerStatement, aby mohly použít metodu setResponseBuffering. Příklady kódu v ukázce čtení velkých dat a čtení velkých dat pomocí ukázky uložených procedur ukazují toto staré použití.

S ovladačem JDBC verze 2.0 však mohou aplikace použít metodu isWrapperFor a metodu unwrap pro přístup k funkcím specifické pro dodavatele bez jakéhokoli předpokladu o hierarchii třídy implementace. Příklad kódu naleznete v tématu Aktualizace velkých objemů dat.

Načítání velkých dat s adaptivním bufferováním

Při čtení velkých hodnot jednou pomocí metod get<Type>Stream a sloupce ResultSet a parametry CallableStatement OUT jsou přístupné v pořadí vráceném SQL Serverem, adaptivní ukládání do vyrovnávací paměti minimalizuje využití paměti aplikace při zpracování výsledků. Při použití adaptivního ukládání do vyrovnávací paměti:

  • Metody get<Type>Stream definované ve třídách SQLServerResultSet a SQLServerCallableStatement ve výchozím nastavení vrací streamy jen pro čtení, i když streamy lze resetovat, pokud je aplikace označí. Pokud chce aplikace reset stream, musí nejprve zavolat metodu mark na tomto proudu.

  • Metody get<Type>Stream definované ve třídách SQLServerClob a SQLServerBlob vrací datové proudy, které lze vždy přemístit na počáteční pozici datového proudu bez volání mark metody.

Pokud aplikace používá adaptivní ukládání do vyrovnávací paměti, hodnoty načtené metodami get<Type>Stream lze načíst pouze jednou. Pokud se pokusíte volat jakoukoli metodu get<Type> ve stejném sloupci nebo parametru po volání metody get<Type>Stream stejného objektu, vyvolá se výjimka se zprávou "Data byla přístupná a není k dispozici pro tento sloupec nebo parametr".

Poznámka:

Volání ResultSet.close() uprostřed zpracování sady ResultSet by vyžadovalo, aby ovladač Microsoft JDBC pro SQL Server četl a zahodil všechny zbývající pakety. To může trvat delší dobu, pokud dotaz vrátil velkou datovou sadu, a to zejména v případě, že je síťové připojení pomalé.

Pokyny pro používání adaptivního bufferování

Vývojáři by měli postupovat podle těchto důležitých pokynů pro minimalizaci využití paměti aplikací:

  • Nepoužívejte vlastnost připojovacího řetězce selectMethod=cursor , aby aplikace mohla zpracovat velmi velkou sadu výsledků. Funkce adaptivního ukládání do vyrovnávací paměti umožňuje aplikacím zpracovávat velmi rozsáhlé sady výsledků jen pro čtení bez použití kurzoru serveru. Všimněte si, že když nastavíte selectMethod=cursor, budou ovlivněny všechny sady výsledků jen pro čtení vytvořené tímto připojením. Jinými slovy, pokud vaše aplikace pravidelně zpracovává krátké sady výsledků s několika řádky, vytváření, čtení a zavření kurzoru serveru pro každou sadu výsledků bude používat více prostředků na straně klienta i na straně serveru, než je případ, kdy selectMethod není nastaven na kurzor.

  • Čtení velkých textových nebo binárních hodnot jako streamů pomocí metod getAsciiStream, getBinaryStream nebo getCharacterStream místo metod getBlob a getClob. Počínaje verzí 1.2 poskytuje třída SQLServerCallableStatement nové metody get<Type>Stream pro tento účel.

  • Ujistěte se, že sloupce s potenciálně velkými hodnotami jsou umístěny jako poslední v seznamu sloupců v příkazu SELECT a že metody get<Type>Stream sqlServerResultSet slouží pro přístup ke sloupcům v pořadí, v jakém jsou vybrány.

  • Ujistěte se, že parametry OUT s potenciálně velkými hodnotami jsou deklarovány jako poslední v seznamu parametrů v SQL sloužící k vytvoření SQLServerCallableStatement. Kromě toho se ujistěte, že metody get<Type>Stream SQLServerCallableStatement se používají pro přístup k parametrům OUT v pořadí, v jakém jsou deklarovány.

  • Vyhněte se provádění více příkazů na stejném připojení současně. Provedení jiného příkazu před zpracováním výsledků předchozího příkazu může způsobit, že nezpracované výsledky se uloží do vyrovnávací paměti aplikace.

  • Existují případy, kdy použití selectMethod=cursor místo responseBuffering=adaptivní by bylo užitečnější, například:

    • Pokud vaše aplikace zpracovává sadu výsledků jen pro čtení pomalu, například pokud čtete každý řádek po zadání od uživatele, může pomoci snížit využití prostředků SQL Serverem použitím selectMethod=cursor místo responseBuffering=adaptivní.

    • Pokud vaše aplikace zpracovává dvě nebo více sad výsledků jen pro čtení ve stejnou dobu na stejném připojení, může použití selectMethod=cursor namísto responseBuffering=adaptivní pomoci snížit paměť potřebnou ovladačem při zpracování těchto sad výsledků.

    V obou případech musíte zvážit režii při vytváření, čtení a zavírání kurzorů serveru.

Kromě toho následující seznam obsahuje některá doporučení pro posouvatelné a aktualizovatelné sady výsledků pouze vpřed:

  • Při posouvání sad výsledků při načítání bloku řádků ovladač vždy přečte do paměti počet řádků označených metodou getFetchSize objektu SQLServerResultSet , i když je povoleno adaptivní ukládání do vyrovnávací paměti. Pokud posouvání způsobí OutOfMemoryError, můžete snížit počet řádků načtených voláním metody setFetchSize objektu SQLServerResultSet nastavit velikost načtení na menší počet řádků, a to i v případě potřeby dolů na 1 řádek. Pokud tomu nebrání OutOfMemoryError, vyhněte se zahrnutí velmi velkých sloupců do posouvatelných sad výsledků.

  • V případě předávacích updatovatelných sad výsledků ovladač obvykle při načítání bloku řádků čte do paměti počet řádků určený metodou getFetchSize objektu SQLServerResultSet, i když je na připojení povoleno adaptivní ukládání do vyrovnávací paměti. Pokud volání další metody SQLServerResultSet objektu má za následek OutOfMemoryError, můžete snížit počet řádků načtených voláním setFetchSize metoda SQLServerResultSet nastavit velikost načtení na menší počet řádků, a to i dolů na 1 řádek, pokud je to potřeba. Můžete také přinutit ovladač, aby neukládal žádné řádky do vyrovnávací paměti tím, že před spuštěním příkazu zavoláte metodu setResponseBuffering objektu SQLServerStatement s parametrem "adaptive". Vzhledem k tomu, že sada výsledků není posuvná, a aplikace přistupuje k hodnotě velkého sloupce pomocí jedné z metod get<Type>Stream, ovladač tuto hodnotu zahodí, jakmile ji aplikace přečte stejně jako pro sady výsledků jen pro čtení.

Viz také

zvýšení výkonu a spolehlivosti pomocí ovladače JDBC