Megosztás a következőn keresztül:


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

A következőre vonatkozik: .NET Framework .NET .NET Standard

ADO.NET letöltése

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, létre kell hozni a kezdeti kézfogást a kiszolgálóval, elemezni kell a kapcsolat sztringjét, a kapcsolatot hitelesítenie kell a kiszolgálónak, ellenőrizni kell a jelenlegi tranzakcióhoz való csatlakozást, é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 az SQL Serverhez készült Microsoft SqlClient-adatszolgáltató egy kapcsolatkészletezés nevű optimalizálási technikát használ.

A kapcsolatkészletezés csökkenti az új kapcsolatok megnyitásának számát. A készletező 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ó meghívja a kapcsolatot Open, 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 meghívja a Close kapcsolatot, a készletező a lezárás helyett visszaadja azt az aktív kapcsolatok készletébe. Miután a kapcsolat visszakerül a készletbe, a következő Open híváshoz már készen áll az újrafelhasználásra.

Csak az azonos konfigurációval rendelkező kapcsolatok készletelhetők. A Microsoft SqlClient adatszolgáltató az SQL Serverhez egyszerre több készletet kezel, mindegyiket különböző konfigurációhoz. A kapcsolatok a kapcsolati sztring és a Windows-identitás alapján kerülnek szétválasztásra kapcsolatcsoportokra az integrált biztonság használatakor. A kapcsolatok össze vannak gyűjtve aszerint, hogy részt vesznek-e egy tranzakcióban. A ChangePassword használatakor 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 SqlCredential használnak, 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 SQL Serverhez készült Microsoft SqlClient-adatszolgáltatóban. 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. Több kapcsolatlánc-módosító is megadható a kapcsolatkészletezési viselkedés szabályozásához. További információért lásd a "Kapcsolatkészletezés szabályozása kapcsolati sztring kulcsszavakkal" című rész későbbi szakaszát.

Fontos

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 a következő 5 másodpercben sikertelen lesz a kapcsolati kísérlet, a "blocking period". 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 végét követő későbbi hibák olyan új blokkolási időszakokat eredményeznek, amelyek az előző blokkolási időszakhoz képest kétszer hosszabbak, legfeljebb 1 percig.

Megjegyzés:

A "blocking period" mechanizmus alapértelmezés szerint nem vonatkozik az Azure SQL Serverre. Ez a viselkedés a PoolBlockingPeriod kivételével a tulajdonság ConnectionString módosításával módosítható.

Memóriakészlet létrehozása és hozzárendelése

A kapcsolat első megnyitásakor egy kapcsolatkészlet jön létre egy pontosan egyező algoritmus alapján, amely a készletet a kapcsolat kapcsolati sztringjével társítja. Minden kapcsolatkészlet külön kapcsolati sztringgel van társítva. Új kapcsolat megnyitásakor, ha a kapcsolati sztring nem egyezik meg egy meglévő készletgel, létrejön egy új készlet.

Megjegyzés:

A kapcsolatok folyamatonként, alkalmazástartományonként, kapcsolati sztringenként é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.

Megjegyzés:

Ha a MinPoolSize nincs megadva a kapcsolati sztringben, vagy nullaként van megadva, a készletben lévő kapcsolatok egy bizonyos inaktív időszak után bezárulnak. Ha azonban a megadott MinPoolSize érték nagyobb, mint nulla, a kapcsolatkészletet nem semmisítik meg, amíg a AppDomain kiü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 rendszer automatikusan törli a tárat végzetes hiba esetén, mint amilyen a feladatátvétel is.

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 karakterlánc az Initial Catalog-hoz rendelt érték alapján tér el egymástól.

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

Kapcsolatok hozzáadása

Minden egyedi kapcsolati sztringhez létrejön egy kapcsolatkészlet. 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 ké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ő úgy elégíti ki a kapcsolatokra vonatkozó kéréseket, hogy újra kiosztja a kapcsolatokat, amikor azok visszakerülnek a készletbe. 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 csatlakozáskezelő 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 küld.

Caution

Határozottan javasoljuk, hogy a használat befejezése után mindig zárja be a kapcsolatot, hogy a kapcsolat visszakerüljön a készletbe. Ezt úgy is megteheti, hogy a Connection objektum Close vagy Dispose metódusait használja, vagy az összes kapcsolatot egy C# using utasításon belül, illetve egy Visual Basic Using utasításon belül nyitja meg. Előfordulhat, hogy a nem explicit módon bezárt kapcsolatok nem lesznek hozzáadva vagy visszakerülnek a készletbe. További információ: Utasítás vagy Útmutató: Rendszererőforrás eltávolítása a Visual Basichez.

Megjegyzés:

Ne hívja meg a(z) Close, Dispose, Connection, DataReader vagy bármely más felügyelt objektumot az osztályának Finalize metódusában. 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

Ha a LoadBalanceTimeout (vagy Connection Lifetime) értéke be van állítva, amikor a kapcsolat visszaadódik a kapcsolatkészletnek, létrehozási ideje összehasonlításra kerül az aktuális időponttal, és a kapcsolat megszakad, ha az időtartam másodpercben megadott értéke meghaladja a LoadBalanceTimeout paramétert. Ez a fürtözött konfigurációkban hasznos a terheléselosztás kényszerítésére egy futó kiszolgáló és egy nemrég online állapotba hozott kiszolgáló között.

Ha a LoadBalanceTimeout (vagy a kapcsolat élettartama) nincs beállítva (alapértelmezett érték = 0), a kapcsolatkészletező eltávolít egy kapcsolatot a készletből, miután körülbelül 4–8 percig tétlen volt (véletlenszerűen kétlépéses módon), vagy ha a készletező azt észleli, hogy a kiszolgálóval való kapcsolat megszakadt.

Megjegyzés:

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 kapcsolat-kezelő előnyeit azáltal, hogy újabb kapcsolatot hoz létre a kiszolgálóval. 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 törlése

Az SQL Serverhez készült Microsoft SqlClient-adatszolgáltató két új módszert vezetett be a készlet törléséhez: ClearAllPools és ClearPool. ClearAllPools Törli egy adott szolgáltató kapcsolatkészleteit, és ClearPool törli az adott kapcsolathoz társított kapcsolatkészletet.

Megjegyzés:

Ha a hívás időpontjában kapcsolatok vannak használatban, azok megfelelően vannak megjelölve. Ha bezárják őket, a rendszer elveti őket ahelyett, hogy visszakerülnének a készletbe.

Tranzakciótámogatás

A kapcsolatok a készletből kerülnek kiválasztásra, és a tranzakciós környezet alapján kerülnek hozzárendelésre. Amennyiben a Enlist=false nincs megadva a kapcsolati sztringben, a kapcsolatkészlet gondoskodik arról, hogy a kapcsolat a Current környezetbe kerüljön. 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 elérhetők, a rendszer a készlet tranzakció nélküli részéből hív le egy kapcsolatot, és csatol. Ha a kapcsolatkészlet egyik területén sem érhető el kapcsolat, a rendszer új kapcsolatot hoz létre és csatolja.

Amikor egy kapcsolat bezárul, a rendszer visszaengedi azt a készletbe, és a tranzakciós környezet alapján a megfelelő felosztásba. 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 a kapcsolati sztring kulcsszavainak segítségével

Az ConnectionString objektum tulajdonsága támogatja a SqlConnection kapcsolati sztringkulcs/érték párokat, amelyek a kapcsolatkészletezési logika viselkedésének módosítására használhatók. További információért lásd 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 karakterlánc és a felhasználói identitás alapján kerülnek készletbe. 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. A hitelesítési adatbázishoz való kapcsolat össze van gyűjtve, és mindenki használja. 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.

// Assume that connectionString connects to master.  
using (SqlConnection connection = new SqlConnection(connectionString))
using (SqlCommand command = new SqlCommand())
{
    connection.Open();
    command.Connection = connection;
    command.CommandText = "USE DatabaseName";
    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.

Alkalmazásszerepkör alternatívái

Javasoljuk, hogy használja ki az alkalmazásszerepkörök helyett használható biztonsági mechanizmusokat.

Lásd még