Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Připojení k databázovému serveru se obvykle skládá z několika časově náročných kroků. Je třeba navázat fyzický kanál, jako je soket nebo pojmenovaná roura, musí dojít k počátečnímu handshaku se serverem, informace připojovacího řetězce musí být analyzovány, připojení musí být serverem ověřeno, musí proběhnout kontroly pro začlenění do probíhající transakce, atd.
Většina aplikací v praxi používá pro připojení jenom jednu nebo několik různých konfigurací. To znamená, že během provádění aplikace se bude opakovaně otevírat a zavírat mnoho identických připojení. Aby se minimalizovaly náklady na otevírání připojení, ADO.NET používá metodu optimalizace označovanou jako sdružování připojení.
Poznámka:
Sdružování připojení v ADO.NET funguje konzistentně ve všech prostředích založených na SQL Serveru, včetně Azure SQL Database, Azure SQL Managed Instance a SQL Serveru (místně nebo ve virtuálních počítačích). Mechanismus sdružování je zcela na straně klienta a funguje identicky napříč těmito platformami. Faktory specifické pro službu ale můžou ovlivnit efektivitu sdružování: Azure SQL Database vynucuje limity připojení na základě vybrané úrovně služby (např. Basic, Standard, Premium), zatímco Azure SQL Managed Instance prováže limity připojení k přiděleným prostředkům instance, jako jsou virtuální jádra a paměť. NAproti tomu SQL Server na virtuálních počítačích nemá žádné vynucené limity nad rámec hardwarových a licenčních omezení, které nabízí největší flexibilitu.
Sdružování připojení snižuje počet otevření nových připojení.
Pooler udržuje vlastnictví fyzického připojení. Spravuje připojení tím, že udržuje aktivní sadu aktivních připojení pro každou danou konfiguraci připojení. Pokaždé, když uživatel volá Open na připojení, nástroj pro sdružování vyhledá ve fondu dostupné připojení. Pokud je připojení ve fondu k dispozici, vrátí se volajícímu místo otevření nového připojení. Když aplikace zavolá Close na připojení, pooler jej místo zavření vrátí do skupiny aktivních připojení. Jakmile se připojení vrátí do fondu, je připraveno k opětovnému použití při dalším volání Open.
Pooled mohou být pouze připojení se stejnou konfigurací. ADO.NET udržuje několik fondů najednou, jeden pro každou konfiguraci. Připojení jsou oddělená do fondů pomocí připojovacího řetězce a identity systému Windows při použití integrovaného zabezpečení. Připojení jsou také sdružována na základě toho, zda jsou zařazena do transakce. Při použití ChangePassword má instance SqlCredential vliv na fond připojení. Různé instance SqlCredential budou používat různé fondy připojení, i když id uživatele a heslo jsou stejné.
Sdružování připojení může výrazně zvýšit výkon a škálovatelnost vaší aplikace. Ve výchozím nastavení je ve ADO.NET povolené sdružování připojení. Pokud ho explicitně nezakážete, nástroj pro sdružování optimalizuje připojení při jejich otevření a zavření ve vaší aplikaci. Můžete také zadat několik modifikátorů připojovacích řetězců pro řízení chování připojení. Další informace najdete v části Řízení sdružování připojení pomocí klíčových slov připojovacího řetězce dále v tomto tématu.
Poznámka:
Pokud je povolené sdružování připojení a pokud dojde k chybě vypršení časového limitu nebo k jiné chybě přihlášení, vyhodí se výjimka a pokusy o připojení v následujících pěti sekundách během "blokujícího období" se nezdaří. Pokud se aplikace pokusí připojit v době blokování, vyvolá se první výjimka znovu. Následná selhání po skončení blokovacího období povedou k novým blokovacím obdobím, která budou dvakrát delší než to předchozí, až do maxima jedné minuty.
Vytvoření a přiřazení fondu
Při prvním otevření připojení se vytvoří fond připojení na základě algoritmu, který přesně odpovídá a přidruží fond k připojovacímu řetězci v připojení. Každý fond připojení je přidružený k odlišnému připojovacímu řetězci. Pokud se otevře nové připojení a pokud připojovací řetězec není přesnou shodou s existujícím fondem, vytvoří se nový fond. Připojení jsou ve fondu za každý proces, za každou doménu aplikace, za každý připojovací řetězec a při použití integrovaného zabezpečení za každou identitu Windows. Připojovací řetězce musí také přesně odpovídat; klíčová slova zadaná v jiném pořadí pro stejné připojení budou spravována odděleně.
V následujícím příkladu jazyka C# se vytvoří tři nové SqlConnection objekty, ale ke správě je potřeba jenom dva fondy připojení. Všimněte si, že první a druhý připojovací řetězec se liší hodnotou přiřazenou k Initial Catalog.
using (SqlConnection connection = new SqlConnection(
"Integrated Security=SSPI;Initial Catalog=Northwind"))
{
connection.Open();
// Pool A is created.
}
using (SqlConnection connection = new SqlConnection(
"Integrated Security=SSPI;Initial Catalog=pubs"))
{
connection.Open();
// Pool B is created because the connection strings differ.
}
using (SqlConnection connection = new SqlConnection(
"Integrated Security=SSPI;Initial Catalog=Northwind"))
{
connection.Open();
// The connection string matches pool A.
}
Důležité
Microsoft doporučuje používat nejbezpečnější dostupný tok ověřování. Pokud se připojujete k Azure SQL, Spravované identity pro prostředky Azure jsou doporučenou metodou ověřování.
Pokud Min Pool Size není v připojovacím řetězci zadána nebo je zadána jako nula, připojení v rámci fondu budou uzavřena po určité době nečinnosti. Pokud je však zadaná Min Pool Size hodnota větší než nula, fond připojení se nezničí, dokud AppDomain se nenačte a proces skončí. Údržba neaktivních nebo prázdných fondů zahrnuje minimální systémové režie.
Poznámka:
Fond se automaticky vymaže, když dojde k závažné chybě, například převzetí služeb při selhání.
Přidejte připojení
Pro každý jedinečný připojovací řetězec se vytvoří fond připojení. Při vytvoření fondu se vytvoří a přidá do fondu více objektů připojení, aby byl splněn požadavek na minimální velikost fondu. Podle potřeby se do fondu přidají připojení až do maximální velikosti fondu (výchozí hodnota je 100). Připojení se uvolní zpět do fondu, když jsou zavřená nebo odstraněna.
Pokud je objekt SqlConnection požadován, a je k dispozici použitelné připojení, objekt se získá z fondu. Aby bylo možné použít připojení, musí být nepoužité, musí mít odpovídající kontext transakce nebo být nepřidružen k libovolnému kontextu transakce a mít platný odkaz na server.
Správce fondu připojení uspokojuje požadavky na připojení tím, že při jejich návratu do fondu znovu přiřazuje uvolněná připojení. Pokud byla dosažena maximální velikost fondu a není k dispozici žádné použitelné připojení, žádost se zařadí do fronty. Fond se pak pokusí znovu získat všechna připojení, dokud nedojde k vypršení časového limitu (výchozí hodnota je 15 sekund). Pokud správce připojení nemůže požadavek splnit před vypršením časového limitu připojení, výjimka se vyvolá.
Upozornění
Důrazně doporučujeme, že připojení vždy zavřete, když ho přestanete používat, aby se připojení vrátilo do fondu. Můžete to provést buď pomocí Close nebo Dispose metod objektu Connection , nebo otevřením všech připojení uvnitř using příkazu v jazyce C# nebo Using příkazem v jazyce Visual Basic. Připojení, která nejsou explicitně ukončená, nemusí být přidána nebo vrácena do fondu. Další informace naleznete v tématu příkaz using nebo Postupy: Zlikvidování systémového prostředku pro Visual Basic.
Poznámka:
Nevyvolávejte ani nezavolávejte CloseDispose, Connectionnebo DataReader žádný jiný spravovaný objekt v Finalize metodě třídy. Ve finalizátoru uvolněte pouze nespravované prostředky, které jsou přímo ve vlastnictví vaší třídy. Pokud vaše třída nevlastní žádné nespravované prostředky, nezahrnujte do definice třídy metodu Finalize . Další informace naleznete v tématu Uvolňování paměti.
Další informace o událostech přidružených k otevírání a zavírání připojení najdete v tématu Audit Login Event Class and Audit Logout Event Class in the SQL Server documentation.
Odstraňte připojení
Nástroj pro sdružování připojení odebere připojení z fondu po dobu přibližně 4 až 8 minut nečinnosti nebo pokud nástroj pro sdružování zjistí, že připojení k serveru bylo přerušeno. Všimněte si, že přerušené připojení lze zjistit až po pokusu o komunikaci se serverem. Pokud se najde připojení, které už není připojené k serveru, označí se jako neplatné. Neplatná připojení jsou z fondu připojení odebrána pouze tehdy, když jsou uzavřena nebo získána zpět.
Pokud existuje připojení k serveru, který zmizel, toto připojení lze vybrat z fondu připojení, i když nástroj pro sdružování připojení nezjistil přerušené připojení a neoznačil ho jako neplatné. Důvodem je, že režie spojená s kontrolou, zda je připojení stále platné, by eliminovala výhody používání sdružovače tím, že by způsobila další cestu na a ze serveru. Když k tomu dojde, první pokus o použití připojení zjistí, že připojení bylo přerušeno a vyvolá se výjimka.
Vymazat bazén
ADO.NET 2.0 zavedl dvě nové metody pro vyprázdnění fondu: ClearAllPools a ClearPool.
ClearAllPools vymaže fondy připojení pro daného poskytovatele a ClearPool vymaže fond připojení přidružený ke konkrétnímu připojení. Pokud se v době volání používají připojení, označí se odpovídajícím způsobem. Když se zavřou, místo toho, aby byly vráceny do fondu, se zahodí.
Podpora transakcí
Připojení se načítají z fondu a přiřazují se na základě kontextu transakce. Pokud není Enlist=false uvedeno v připojovacím řetězci, fond připojení zajistí zařazení připojení do kontextu Current. Pokud je připojení uzavřeno a vráceno do fondu s připojenou System.Transactions transakcí, je nastaveno stranou takovým způsobem, že další požadavek na fond připojení se stejnou System.Transactions transakcí vrátí stejné připojení, pokud je k dispozici. Pokud je taková žádost vydána a ve fondu nejsou k dispozici žádná připojení, je připojení odebráno z části fondu, která není zapojena do transakce, a zařazeno. Pokud nejsou v žádné oblasti fondu k dispozici žádná připojení, vytvoří se nové připojení a připojí se.
Když je připojení uzavřeno, uvolní se zpět do fondu a do příslušného pododdílu podle jeho transakčního kontextu. Připojení proto můžete zavřít bez generování chyby, i když distribuovaná transakce stále čeká na vyřízení. To vám umožní potvrdit nebo přerušit distribuovanou transakci později.
Řízení sdružování připojení pomocí klíčových slov řetězce připojení
ConnectionString Vlastnost objektu SqlConnection podporuje řetězec připojení s páry klíčů a hodnot, které lze použít k úpravě chování řízení sdružování připojení. Další informace najdete na webu ConnectionString.
Fragmentace fondu
Fragmentace fondu je běžným problémem v mnoha webových aplikacích, kde může aplikace vytvořit velký počet fondů, které nejsou uvolněny, dokud proces neskončí. To způsobí, že velký počet připojení zůstane otevřený a spotřebovává paměť, což vede k nízkému výkonu.
Fragmentace fondu z důvodu integrovaného zabezpečení
Připojení jsou ve fondu podle připojovacího řetězce a uživatelské identity. Proto pokud používáte základní ověřování nebo ověřování systému Windows na webu a integrované zabezpečení přihlašování, máte přidělený jeden fond na uživatele. I když se tím zlepší výkon následných žádostí o databázi pro jednoho uživatele, nemůže tento uživatel využívat připojení provedená jinými uživateli. Výsledkem je také alespoň jedno připojení na uživatele k databázovému serveru. Jedná se o vedlejší účinek konkrétní architektury webových aplikací, kterou musí vývojáři zvážit s požadavky na zabezpečení a auditování.
Fragmentace fondu kvůli mnoha databázím
Mnoho poskytovatelů internetových služeb hostuje několik webů na jednom serveru. Můžou použít jednoúčelovou databázi k potvrzení přihlášení pomocí formulářů a pak otevřít připojení ke konkrétní databázi pro daného uživatele nebo skupinu uživatelů. Připojení k ověřovací databázi je ve fondu a používá ho všichni. Existuje však samostatný pool připojení k jednotlivým databázím, který zvyšuje počet připojení k serveru.
Jedná se také o vedlejší účinek návrhu aplikace. Existuje poměrně jednoduchý způsob, jak se vyhnout tomuto vedlejšímu efektu, aniž byste museli ohrozit zabezpečení při připojování k SQL Serveru. Místo připojení k samostatné databázi pro každého uživatele nebo skupiny se připojte ke stejné databázi na serveru a pak spusťte příkaz Transact-SQL USE, který se změní na požadovanou databázi. Následující fragment kódu ukazuje vytvoření počátečního připojení k master databázi a následné přepnutí na požadovanou databázi zadanou databaseName v řetězcové proměnné.
' Assumes that command is a SqlCommand object.
command.Text = "USE DatabaseName"
Using connection As New SqlConnection(connectionString)
connection.Open()
command.ExecuteNonQuery()
End Using
// Assumes that command is a SqlCommand object.
command.Text = "USE DatabaseName";
using (SqlConnection connection = new SqlConnection(
connectionString))
{
connection.Open();
command.ExecuteNonQuery();
}
Role aplikací a sdružování připojení
Po aktivaci role aplikace SYSTÉMU SQL Server voláním sp_setapprole uložené procedury systému nelze obnovit kontext zabezpečení tohoto připojení. Pokud je však sdružování povoleno, připojení se vrátí do fondu a při opětovném použití tohoto sdruženého připojení dojde k chybě.