SQL Server-kapcsolatkészletezés (ADO.NET)

Az adatbázis-kiszolgálóhoz való csatlakozás általában több időigényes lépésből áll. Létre kell hozni egy fizikai csatornát, például egy foglalatot vagy egy elnevezett csövet, kezdeményezni kell a kezdeti kézfogást a kiszolgálóval, elemezni kell a kapcsolati sztring információját, a kapcsolatot hitelesítenie kell a kiszolgálónak, ellenőrizni kell az aktuális tranzakcióba való felvételt, és így tovább.

A gyakorlatban a legtöbb alkalmazás csak egy vagy néhány különböző konfigurációt használ a kapcsolatokhoz. Ez azt jelenti, hogy az alkalmazás végrehajtása során számos azonos kapcsolat ismételten megnyílik és bezárul. A kapcsolatok megnyitásának költségeinek minimalizálása érdekében ADO.NET a kapcsolatkészletezés nevű optimalizálási technikát használja.

Megjegyzés

A ADO.NET kapcsolatkészletezése következetesen működik minden SQL Server-alapú környezetben, beleértve az Azure SQL Database-t, a felügyelt Azure SQL-példányt és az SQL Servert (helyszíni vagy virtuális gépeken)). A készletezési mechanizmus teljes mértékben ügyféloldali, és azonos módon működik ezeken a platformokon. A szolgáltatásspecifikus tényezők azonban befolyásolhatják a készletezési hatékonyságot: az Azure SQL Database a kiválasztott szolgáltatási szint (például alapszintű, standard, prémium) alapján kényszeríti ki a kapcsolati korlátokat, míg az Azure SQL Managed Instance a példány lefoglalt erőforrásaihoz, például a virtuális magokhoz és a memóriához köti a kapcsolat korlátait. Ezzel szemben a virtuális gépeken futó SQL Server nem rendelkezik a hardveres és licencelési korlátozásokon túli kikényszerített korlátozásokkal, így a legnagyobb rugalmasságot nyújtja.

A kapcsolatkészletezés csökkenti az új kapcsolatok megnyitásának számát. A pooler fenntartja a fizikai kapcsolat tulajdonjogát. Úgy kezeli a kapcsolatokat, hogy minden egyes kapcsolatkonfigurációhoz aktív kapcsolatokat tart életben. Amikor egy felhasználó kapcsolatot hív Open meg, a készletező egy elérhető kapcsolatot keres a készletben. Ha egy készletezett kapcsolat elérhető, az új kapcsolat megnyitása helyett visszaadja a hívónak. Amikor az alkalmazás használja Close a kapcsolatot, a készletező ahelyett, hogy bezárná, visszaadja azt az aktív kapcsolatok pooljába. Miután a kapcsolat visszakerül a készletbe, újra felhasználható a következő Open hívásra.

Csak az azonos konfigurációval rendelkező kapcsolatok készletelhetők. ADO.NET egyszerre több készletet is tart, egyet az egyes konfigurációkhoz. A kapcsolatokat a kapcsolat karakterlánc, illetve integrált biztonság esetén a Windows-identitás alapján választják szét a készletekbe. A kapcsolatok is össze vannak gyűjtve attól függően, hogy egy tranzakcióban szerepelnek-e. A ChangePassword alkalmazása során a SqlCredential példány hatással van a kapcsolatkészletre. A különböző példányok különböző kapcsolatkészleteket használnak SqlCredential, még akkor is, ha a felhasználói azonosító és a jelszó megegyezik.

A kapcsolatok készletezése jelentősen javíthatja az alkalmazás teljesítményét és méretezhetőségét. Alapértelmezés szerint a kapcsolatkészletezés engedélyezve van az ADO.NET. Hacsak nem tiltja le explicit módon, a készletező optimalizálja a kapcsolatokat, amikor azok meg vannak nyitva és bezárva az alkalmazásban. A kapcsolat-pool kezelésének szabályozásához több kapcsolati sztringhez tartozó módosító is megadható. További információ a "Kapcsolatkészletezés szabályozása kapcsolati sztring kulcsszavakkal" című témakör későbbi részében található.

Megjegyzés

Ha engedélyezve van a kapcsolatkészletezés, és időtúllépési hiba vagy más bejelentkezési hiba történik, a rendszer kivételt küld, és az azt követő csatlakozási kísérletek a következő öt másodpercben meghiúsulnak, a "blokkolási időszak". Ha az alkalmazás a blokkolási időszakon belül próbál csatlakozni, az első kivétel ismét ki lesz dobva. A blokkolási időszak lejárta után bekövetkező későbbi hibák olyan új blokkolási időszakokat eredményeznek, amelyek kétszer hosszabbak az előző blokkolási időszakhoz képest, legfeljebb egy percig.

Készlet létrehozása és hozzárendelése

A kapcsolat első megnyitásakor egy kapcsolatkészlet létrehozásra kerül egy pontos egyezési algoritmus alapján, amely a kapcsolatkészletet a kapcsolatban lévő kapcsolati sztringgel társítja. Minden kapcsolatkészlethez egy külön kapcsolati karakterlánc van rendelve. Ha a kapcsolati lánc nem pontosan egyezik meg egy meglévő készletével, új kapcsolat megnyitásakor létrejön egy új készlet. A kapcsolatok folyamatonként, alkalmazástartományonként, kapcsolati sztring és integrált biztonság használata esetén Windows-identitásonként vannak készletben. A kapcsolati sztringeknek is pontos egyezésnek kell lenniük; az azonos kapcsolathoz eltérő sorrendben megadott kulcsszavak külön lesznek csoportosítva.

A következő C#-példában három új SqlConnection objektum jön létre, de a kezelésükhöz csak két kapcsolatkészlet szükséges. Vegye figyelembe, hogy az első és a második kapcsolati sztring a Initial Catalog-hoz rendelt értékekben különböznek.

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.
    }

Fontos

A Microsoft azt javasolja, hogy a legbiztonságosabb hitelesítési folyamatot használja. Ha az Azure SQL-hez csatlakozik, az Azure-erőforrásokhoz használt felügyelt identitások az ajánlott hitelesítési módszer.

Ha Min Pool Size vagy nincs megadva a kapcsolati karakterláncban, vagy nullaként van megadva, a készlet kapcsolatai egy inaktív időszak után bezárulnak. Ha azonban a megadott Min Pool Size érték nagyobb, mint nulla, a kapcsolatkészletet nem semmisítik meg, amíg a AppDomain ki nem ürül, és a folyamat véget nem ér. Az inaktív vagy üres készletek karbantartása minimális rendszerterhelést igényel.

Megjegyzés

A pool automatikusan törlődik, amikor egy végzetes hiba lép fel, például átállás esetén.

Kapcsolatok hozzáadása

Az egyedi kapcsolati karakterlánchoz egy kapcsolatkészlet jön létre. Készlet létrehozásakor a rendszer több kapcsolati objektumot hoz létre és ad hozzá a készlethez, hogy a készlet minimális méretkövetelménye teljesüljön. A rendszer szükség szerint hozzáadja a kapcsolatokat a kapcsolatkészlethez, a megadott maximális méretig (alapértelmezés szerint 100). A kapcsolatok visszaengedhetők a készletbe, amikor bezárják vagy megsemmisítik őket.

Amikor egy SqlConnection objektumot kérnek, a rendszer a készletből szerzi be, ha használható kapcsolat áll rendelkezésre. Ahhoz, hogy használható legyen, a kapcsolatnak fel nem használtnak kell lennie, egyező tranzakciós környezettel kell rendelkeznie, vagy nem kell társítania semmilyen tranzakciós környezettel, és érvényes hivatkozással kell rendelkeznie a kiszolgálóra.

A kapcsolatkészletező kielégíti a kapcsolatokra vonatkozó kéréseket úgy, hogy a visszaengedett kapcsolatokat újra elhelyezi a készletben. Ha elérte a maximális készletméretet, és nem érhető el használható kapcsolat, a kérés várólistára kerül. A készletező ezután megpróbálja visszanyerni a kapcsolatokat, amíg el nem éri az időtúllépést (az alapértelmezett érték 15 másodperc). Ha a készletező nem tudja teljesíteni a kérést, mielőtt a kapcsolat túllépi az időkorlátot, a rendszer kivételt jelez.

Figyelemfelhívás

Határozottan javasoljuk, hogy a használat befejezésekor mindig zárja le a csatlakozást, hogy az visszakerüljön a kapcsolatkészletbe. Ezt megteheti a Close vagy Dispose metódusok Connection objektumának használatával, vagy a C# using utasításában, vagy a Visual Basic Using utasításában található összes kapcsolat megnyitásával. Előfordulhat, hogy a nem explicit módon bezárt kapcsolatok nem lesznek hozzáadva vagy visszahelyezhetők a készletbe. További információkért lásd: using utasítás vagy Hogyan távolítsunk el egy rendszererőforrást a Visual Basicben.

Megjegyzés

Az osztálya Close metódusában ne hívjon vagy használjon Dispose, Connection, DataReader, Finalize vagy bármely más felügyelt objektumot. A véglegesítőben csak az osztály tulajdonában lévő nem felügyelt erőforrásokat szabadíthatja fel. Ha az osztály nem rendelkezik nem felügyelt erőforrásokkal, ne foglaljon bele metódust Finalize az osztálydefinícióba. További információ: Szemétgyűjtés.

A kapcsolatok megnyitásával és bezárásával kapcsolatos eseményekről az SQL Server dokumentációjában található Naplózási eseményosztály és naplózási eseményosztály című témakörben talál további információt.

Kapcsolatok eltávolítása

A kapcsolatkészletező eltávolít egy kapcsolatot a készletből, miután körülbelül 4–8 percig tétlen volt, vagy ha a készletező azt észleli, hogy megszakadt a kapcsolat a kiszolgálóval. Vegye figyelembe, hogy megszakadt kapcsolat csak a kiszolgálóval való kommunikáció után észlelhető. Ha olyan kapcsolat található, amely már nem csatlakozik a kiszolgálóhoz, érvénytelenként van megjelölve. Az érvénytelen kapcsolatok csak akkor lesznek eltávolítva a kapcsolatkészletből, ha bezárták vagy visszavonták őket.

Ha egy olyan kiszolgálóhoz van kapcsolat, amely eltűnt, akkor is meg lehet vonni ezt a kapcsolatot a készletből, ha a kapcsolatkészletező nem észlelte a megszakított kapcsolatot, és érvénytelenként jelölte meg. Ez azért van így, mert a kapcsolat érvényességének ellenőrzésével járó többletterhelés megszünteti a csatlakozás készletkezelő előnyeit azáltal, hogy újabb oda-vissza utazást okoz a kiszolgálóra. Ha ez történik, a kapcsolat használatának első kísérlete észleli, hogy a kapcsolat megszakadt, és a rendszer kivételt küld.

A pool kiürítése

ADO.NET 2.0 két új módszert vezetett be a készlet törlésére: ClearAllPools és ClearPool. ClearAllPools Törli egy adott szolgáltató kapcsolatkészleteit, és ClearPool törli az adott kapcsolathoz társított kapcsolatkészletet. Ha a hívás időpontjában kapcsolatok vannak használatban, azok megfelelően vannak megjelölve. Amikor bezárják őket, elvetésre kerülnek, ahelyett hogy visszakerülnének a készletbe.

Tranzakciótámogatás

A kapcsolódások a készletből kerülnek kiválasztásra, és a tranzakciós környezet alapján hozzárendelik őket. Hacsak nem szerepel Enlist=false a kapcsolati sztringben, a kapcsolatkészlet gondoskodik arról, hogy a kapcsolat szerepel a Current környezetben. Ha egy kapcsolat lezárul, és egy bevont System.Transactions tranzakcióval visszakerül a készletbe, a rendszer úgy teszi félre, hogy az ugyanazon System.Transactions tranzakcióval rendelkező kapcsolatkészlet következő kérése ugyanazt a kapcsolatot adja vissza, ha elérhető. Ha ilyen kérést adnak ki, és nincsenek készletezett kapcsolatok, a rendszer a készlet nem áthúzott részéből hoz létre kapcsolatot, és felvesz. Ha a kapcsolatkészlet egyik területén sem érhető el kapcsolat, a rendszer új kapcsolatot hoz létre és foglal be.

Ha egy kapcsolat bezárul, a rendszer visszaengedi a készletbe és a megfelelő albontásba a tranzakciós környezet alapján. Ezért hiba nélkül is bezárhatja a kapcsolatot, még akkor is, ha egy elosztott tranzakció még függőben van. Ez lehetővé teszi, hogy később véglegesítse vagy megszakítsa az elosztott tranzakciót.

Kapcsolatkészletezés szabályozása kapcsolati karakterlánc kulcsszavakkal

Az ConnectionString objektum SqlConnection tulajdonsága támogatja a kapcsolati karakterlánc kulcs/érték párokat, amelyek a kapcsolatkészletező logika viselkedésének módosítására használhatók. További információ: ConnectionString.

Készlet töredezettsége

A készlettöredezettség gyakori probléma számos webalkalmazásban, ahol az alkalmazás nagy számú készletet hozhat létre, amelyek nem szabadulnak fel, amíg a folyamat le nem záródik. Így sok kapcsolat nyílik meg és használ memóriát, ami gyenge teljesítményt eredményez.

Készlettöredezettség az integrált biztonság miatt

A kapcsolatok a kapcsolati sztring és a felhasználói identitás alapján összevonva vannak. Ezért ha alapszintű hitelesítést vagy Windows-hitelesítést használ a webhelyen, és integrált biztonsági bejelentkezést használ, felhasználónként egy készletet kap. Bár ez javítja az egy felhasználóra vonatkozó későbbi adatbázis-kérelmek teljesítményét, ez a felhasználó nem tudja kihasználni a más felhasználók által létrehozott kapcsolatokat. Emellett felhasználónként legalább egy kapcsolatot létesít az adatbázis-kiszolgálóval. Ez egy adott webalkalmazás-architektúra mellékhatása, amelyet a fejlesztőknek mérlegelniük kell a biztonsági és naplózási követelményekkel szemben.

A készlet töredezettsége számos adatbázis miatt

Számos internetszolgáltató több webhelyet üzemeltet egyetlen kiszolgálón. Egyetlen adatbázist használhatnak az Űrlaphitelesítési bejelentkezés megerősítéséhez, majd megnyithatnak egy kapcsolatot egy adott adatbázissal az adott felhasználó vagy felhasználói csoport számára. Az autentikációs adatbázishoz való kapcsolat csomagban van és közös használat alatt áll. Az egyes adatbázisokhoz azonban külön kapcsolatkészlet tartozik, amely növeli a kiszolgálóval létesített kapcsolatok számát.

Ez az alkalmazásterv egyik mellékhatása is. Viszonylag egyszerűen elkerülheti ezt a mellékhatást anélkül, hogy veszélyeztetné a biztonságot az SQL Serverhez való csatlakozáskor. Ahelyett, hogy minden felhasználóhoz vagy csoporthoz külön adatbázishoz csatlakozik, csatlakozzon ugyanahhoz az adatbázishoz a kiszolgálón, majd hajtsa végre a Transact-SQL USE utasítást a kívánt adatbázisra való váltáshoz. Az alábbi kódrészlet bemutatja az master adatbázishoz való kezdeti kapcsolatot, majd a sztringváltozóban databaseName megadott kívánt adatbázisra való váltást.

' 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();
  }

Alkalmazásszerepkörök és kapcsolatkészletezés

Miután aktiválta az SQL Server-alkalmazásszerepkört a sp_setapprole rendszer által tárolt eljárás meghívásával, a kapcsolat biztonsági környezete nem állítható alaphelyzetbe. Ha azonban a készletezés engedélyezve van, a kapcsolat visszakerül a készletbe, és hiba történik a készletben lévő kapcsolat újrafelhasználásakor.

Lásd még