SQL Server Csatlakozás ion pooling (ADO.NET)

az adatbázis-kiszolgálóra 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 szoftvercsatornát vagy egy elnevezett csövet, létre kell hozni a kiszolgálóval való kezdeti kézfogást, elemezni kell a kapcsolati sztring információkat, a kapcsolatot hitelesítenie kell a kiszolgálónak, ellenőriznie 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.

Csatlakozás ké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ó 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 meghívja Close a kapcsolatot, a készletező a bezárás helyett az aktív kapcsolatok készletezett készletének adja vissza. Miután a kapcsolat visszakerül a készletbe, készen áll 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. Csatlakozás kapcsolati sztring, integrált biztonság esetén pedig Windows-identitás választja el a készleteket. Csatlakozás a rendszer az alapján is csoportosítja őket, hogy egy tranzakcióban szerepelnek-e. A használat során ChangePassworda 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 a 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 kapcsolatkészletezési viselkedés szabályozásához több kapcsolati sztring módosító is megadható. További információ: "Csatlakozás ion-készletezés szabályozása Csatlakozás ion string kulcsszavakkal" című témakör későbbi részében.

Feljegyzé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 jön létre egy pontosan egyező algoritmus alapján, amely a készletet a kapcsolat kapcsolati sztring társítja. Minden kapcsolatkészlet külön kapcsolati sztring van társítva. Új kapcsolat megnyitásakor, ha a kapcsolati sztring nem egyezik meg egy meglévő készletével, létrejön egy új készlet. Csatlakozás a rendszer folyamatonként, alkalmazástartományonként, kapcsolati sztring és integrált biztonság használata esetén Windows-identitásonként készletezi. Csatlakozás ion sztringeknek is pontos egyezésnek kell lenniük; az ugyanahhoz a 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 eltérnek a hozzárendelt értéktőlInitial 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.  
    }  

Ha Min Pool Size nincs megadva a kapcsolati sztring, vagy nullaként van megadva, a készlet kapcsolatai inaktivitási 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 ki nem ürítik és AppDomain a folyamat véget nem ér. Az inaktív vagy üres készletek karbantartása minimális rendszerterhelést igényel.

Feljegyzés

A rendszer automatikusan törli a készletet végzetes hiba, például feladatátvétel esetén.

Csatlakozás hozzáadása

Minden egyes egyedi kapcsolati sztring 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 Csatlakozás szükség szerint hozzáadódnak a készlethez, a megadott maximális készletméretig (alapértelmezés szerint 100). Csatlakozás a rendszer visszaengedi őket 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 újratelepíti a kapcsolatokat a készletbe való visszaengedéskor. 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 küld.

Figyelemfelhívás

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 megteheti az objektum vagy Dispose metódusok CloseConnection használatával, vagy egy C#-utasításban vagy egy usingUsing Visual Basic-utasításban található összes kapcsolat megnyitásával. A kifejezetten nem bezárt Csatlakozás nem lehet hozzáadni vagy visszajutni a készletbe. További információ: utasítás vagy útmutató: Rendszererőforrás eltávolítása a Visual Basichez.

Feljegyzés

Az osztály metódusában Finalize ne hívjon fel vagy ne használjon ConnectionDisposeClose egy , egyDataReader, 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.

Csatlakozás 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 kiküszöböli a készletezők 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 készlet törlé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. Ha bezárják őket, a rendszer elveti őket ahelyett, hogy visszakerülnének a készletbe.

Tranzakciótámogatás

Csatlakozás a készletből származnak, és a tranzakciós környezet alapján vannak hozzárendelve. Ha Enlist=false nincs megadva a kapcsolati sztring, a kapcsolatkészlet gondoskodik arról, hogy a kapcsolat szerepel-e 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 ké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.

A Csatlakozás ion-készletezés szabályozása Csatlakozás ion-sztringszavakkal

Az ConnectionString objektum tulajdonsága támogatja kapcsolati sztring SqlConnection kulcs/é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ó: 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 Csatlakozás a kapcsolati sztring és a felhasználói identitás alapján vannak csoportosítva. 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ó kapcsolatot mindenki készletbe rendezi és 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 U Standard kiadás 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 valid SqlCommand object and that  
' connectionString connects to master.  
    command.Text = "USE DatabaseName"  
Using connection As New SqlConnection(connectionString)  
    connection.Open()  
    command.ExecuteNonQuery()  
End Using  
// Assumes that command is a SqlCommand object and that  
// connectionString connects to master.  
command.Text = "USE DatabaseName";  
using (SqlConnection connection = new SqlConnection(  
  connectionString))  
  {  
    connection.Open();  
    command.ExecuteNonQuery();  
  }  

Alkalmazásszerepkörök és Csatlakozás ion-ké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. További információkért tekintse meg a Tudásbázis "SQL-alkalmazásszerepkör-hibák OLE DB-erőforráskészletezéssel" című cikkét.

Alkalmazásszerepkör alternatívái

Javasoljuk, hogy használja ki az alkalmazásszerepkörök helyett használható biztonsági mechanizmusokat. További információ: Alkalmazásszerepkörök létrehozása az SQL Serveren.

Lásd még