Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
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 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.
Feljegyzé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 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. A kapcsolatokat kapcsolati sztring, integrált biztonság esetén pedig Windows-identitás választja el a készletek között. A kapcsolatok is készletbe vannak állítva attól függően, 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ó: "Kapcsolatkészletezés szabályozása kapcsolati sztring 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. 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 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.
}
Fontos
A Microsoft azt javasolja, hogy a legbiztonságosabb hitelesítési folyamatot használja. Ha azure SQL-hez csatlakozik, az Azure-erőforrások felügyelt identitásai az ajánlott hitelesítési módszer.
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.
Kapcsolatok 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 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ő 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ésekor mindig zárja be a kapcsolatot, hogy a kapcsolat visszakerüljön a készletbe. Ezt megteheti az objektum vagy Close metódusok DisposeConnection használatával, vagy egy C#-utasításban vagy egy usingUsing Visual Basic-utasításban található összes kapcsolat megnyitásával. 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.
Feljegyzés
Az osztály metódusában Close ne hívjon fel vagy ne használjon DisposeConnectionDataReader egy , egyFinalize, 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 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
A kapcsolatok 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.
Kapcsolatkészletezés szabályozása kapcsolati sztring kulcsszavakkal
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 kapcsolatok a kapcsolati sztring és a felhasználói identitás alapján vannak készletben. 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 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.