Samenvatting Vandaag ga ik het hebben over database-verbindingspools. Om eerlijk te zijn zei ik dat de eendperen erg groot is. Omdat verbindingspools relatief moeilijk te begrijpen zijn vergeleken met andere hoofdstukken. Ik wil het je uitleggen in de meest populaire zinnen, maar het is geen gemakkelijke taak. Verbindingspools zijn echter ook een zeer belangrijk kennispunt, vooral bij het uitrollen van multi-user programma's. Daarom moet ik niet alleen spreken, maar ook grondig. In dit artikel begrijp je de basisprincipes van connection pooling en hoe dit al wordt ingezet om de prestaties van je applicatie te verbeteren.
Inhoudsopgave Wat is een verbindingspool? Hoe de verbindingspool werkt Laten we het hebben over een paar zeer belangrijke eigenschappen van verbindingspools Uitzonderingen en afhandelingsmethoden voor verbindingspools Een manier om de status van je verbinding te monitoren Basisprincipes voor efficiënt gebruik van verbindingspools 1. Wat is een verbindingspool? In het vorige artikel, "ADO.NET You Must Know (4) Taste Connection Objects", heb ik benadrukt dat het tot stand brengen van een databaseverbinding een zeer tijdrovend (tijdrovend) en arbeidsintensief (resource-intensief) proces is. Dit komt doordat verbinden met een databaseserver verschillende langdurige processen inhoudt: het opzetten van een fysiek kanaal (zoals een socket of benoemde pijplijn), het maken van een eerste handdruk met de server, het analyseren van de verbindingsstringinformatie, het laten authenticeren van de verbinding, het uitvoeren van een controle om te registreren in de huidige transactie, enzovoort. Ongeacht waarom zo'n mechanisme bestaat, is er altijd een reden voor bestaan. Aangezien het zo pijnlijk is om een nieuwe verbinding te maken, waarom zou je dan niet een bestaande hergebruiken?
In feite geeft ADO.NET ons al een optimalisatiemethode genaamd connection pooling. Een verbindingspool is zo'n container: deze herbergt een bepaald aantal fysieke verbindingen met de databaseserver. Daarom hoeven we, wanneer we verbinding moeten maken met de databaseserver, alleen een vrije verbinding uit de pool (container) te halen in plaats van een nieuwe aan te maken. Dit vermindert de overhead voor het verbinden met de database aanzienlijk, wat de prestaties van de applicatie verbetert.
PS:本来做了2张图片来描述连接池的,无奈公司装有监控软件,不能上传,所以只能等下次有时间上传了。
2. Hoe de verbindingspool werkt 2.1 Maak een verbindingspool aan Het moet worden opgemerkt dat verbindingspools klassengevoelig zijn. Dat wil zeggen, hetzelfde applicatiedomein kan meerdere verschillende soorten verbindingspools tegelijk hebben. Dus, hoe worden verbindingspools geïdentificeerd? In detail wordt het onderscheiden door de handtekening die het proces vormt, het applicatiedomein, de verbindingsstring en de Windows-identiteit (bij gebruik van geïntegreerde beveiliging). Voor hetzelfde toepassingsdomein wordt het echter meestal alleen geïdentificeerd door de verbindingsstring. Wanneer een verbinding wordt geopend, wordt een nieuwe verbindingspool aangemaakt als de typehandtekening van de stripverbinding niet overeenkomt met het type van de bestaande verbindingspool. anders wordt er geen nieuwe verbindingspool aangemaakt.
Een typisch voorbeeld van het creëren van een verbinding:
In het bovenstaande geval heb ik drie SqlConnection-objecten gemaakt, maar er waren slechts twee verbindingspools nodig om ze te beheren. Voorzichtige vrienden, jullie hebben misschien al ontdekt dat conn1 en conn3 dezelfde verbindingsstring hebben, dus ze kunnen een verbindingspool delen, terwijl conn2 en conn1 verschillen van conn3, dus je moet een nieuwe verbindingspool aanmaken.
2.2 Toewijzen van inactieve verbindingen Wanneer een gebruiker een verbindingsverzoek aanmaakt of het Open of a Connection-object aanroept, moet de verbindingspoolmanager eerst een verbindingspool van het bijpassende type vinden op basis van de typehandtekening van het verbindingsverzoek, en vervolgens proberen een vrije verbinding toe te wijzen. De details zijn als volgt:
Als er een beschikbare verbinding in de pool is, geef dan de verbinding terug. Als alle verbindingen in het zwembad uitgeput zijn, maak dan een nieuwe verbinding om aan het zwembad toe te voegen. Als het maximale aantal verbindingen in de pool is bereikt, komt het verzoek in de wachtrij totdat er vrije verbindingen beschikbaar zijn. 2.3 Verwijder Ongeldige Verbindingen Ongeldige verbindingen, dat wil zeggen verbindingen die niet correct aansluiten op de databaseserver. Voor verbindingspools is het aantal opgeslagen verbindingen naar de databaseserver beperkt. Daarom zal als ongeldige verbindingen niet in de tijd worden verwijderd, ruimte in de verbindingspool verspild worden. Sterker nog, u hoeft zich geen zorgen te maken, de verbindingspoolmanager heeft deze problemen heel goed voor ons opgelost. Als een verbinding langere tijd inactief is, of als het detecteert dat de verbinding met de server is verbroken, verwijdert de verbindingspoolmanager de verbinding uit de pool.
2.4 Gebruikte verbindingen recyclen Wanneer we klaar zijn met het gebruik van een verbinding, moeten we deze op tijd sluiten of vrijgeven zodat de verbinding kan worden teruggegeven aan de pool voor hergebruik. We kunnen de verbinding sluiten via de Close of Dispose-methode van het Connection-object, of via de using statement in C#.
3. Vertel me over een paar zeer belangrijke eigenschappen Het gedrag van de verbindingspool kan worden aangestuurd door verbindingsstrings en omvat voornamelijk vier belangrijke eigenschappen:
Verbindingstime-out: De tijd waarop het verbindingsverzoek moet wachten op een time-out. De standaard is 15 seconden in seconden. Maximale poolgrootte: Het maximale aantal verbindingen in de verbindingspool. De standaard is 100. Minimale poolgrootte: Het minimale aantal verbindingen in de verbindingspool. De standaard is 0.
Pooling: 是否启用连接池。ADO.NET默认是启用连接池的,因此,你需要手动设置Pooling=false来禁用连接池。 Laten we een voorbeeld nemen om de eigenschappen van de verbindingspool te begrijpen. De code is als volgt:
4. Uitzonderingen en afhandelingsmethoden voor verbindingspools Wanneer een gebruiker een verbinding opent zonder deze correct of tijdig te sluiten, veroorzaakt dit vaak het "verbindingslek"-probleem. De gelekte verbinding blijft open totdat de Dispose-methode wordt aangeroepen, waarna de Garbage Collector (GC) de verbinding sluit en losmaakt. In tegenstelling tot ADO moet ADO.NET gebruikte verbindingen handmatig sluiten. Een belangrijke mythe is dat de verbinding gesloten is wanneer het verbonden object buiten het lokale bereik valt. In feite wordt wanneer het buiten scope valt, alleen het verbindingsobject vrijgegeven, niet de verbindingsbron. Laten we eerst naar een voorbeeld kijken.
Om de resultaten duidelijker te maken, heb ik het maximale aantal verbindingen speciaal ingesteld op 5 en de time-out tijd is 1 seconde. Na het lopen worden de volgende resultaten snel verkregen.
Uit bovenstaande resultaten blijkt duidelijk dat er een afwijking is in de verbinding. We weten al dat het maximale aantal verbindingen in de verbindingspool 5 is, en wanneer de 6e verbinding wordt gemaakt, is het noodzakelijk om op de verbinding te wachten totdat deze uitloopt omdat het maximale aantal verbindingen in de verbindingspool het maximale aantal heeft bereikt en er geen vrije verbindingen meer zijn. Wanneer de time-out tijd wordt overschreden, verschijnt de hierboven genoemde verbindingsuitzondering. Daarom moet ik nogmaals benadrukken dat gebruikte verbindingen zo snel mogelijk correct gesloten en losgelaten moeten worden.
5. Methoden voor het monitoren van de status van SQL Server-verbindingen (1) Via de activiteitsmonitor Stap 1: Open de MSSMS Manager en klik op het pictogram "Activity Monitor".
Stap 2: Klik in de weergave Activiteitenmonitor Open op het tabblad Processen.
Stap 3: Voer het voorbeeld uit in #4 Connection Pool Exceptions and Handling Methods, je kunt de 5 open verbindingen zien zoals weergegeven in de onderstaande figuur.
(2) Gebruik T-SQL-instructies Evenzo kunnen we, door de systeemopgeslagen procedure uit te voeren sp_who ook de toestand van de verbinding monitoren.
6. Basisprincipes voor efficiënt gebruik van verbindingspools Goed gebruik maken van de verbindingspool zal de prestaties van je applicatie aanzienlijk verbeteren. Integendeel, als het verkeerd wordt gebruikt, zal het geen kwaad doen. In het algemeen moeten de volgende principes worden gevolgd:
Vraag zo snel mogelijk een verbinding aan, verbreek de verbinding zo snel mogelijk. Wanneer je de verbinding sluit, sluit dan eerst de relevante door de gebruiker gedefinieerde transactie. Zorg voor en onderhoud ten minste één open verbinding in de verbindingspool. Probeer zwembadafval te vermijden. Dit omvat voornamelijk poolfragmentatie die wordt gegenereerd door geïntegreerde beveiliging en poolfragmentatie die wordt gegenereerd met behulp van veel databases. Tip: Poolfragmentatie is een veelvoorkomend probleem in veel webapplicaties, en applicaties kunnen een groot aantal pools creëren die pas worden vrijgegeven als het proces is afgesloten. Op deze manier worden er veel verbindingen geopend, wat veel geheugen inneemt en resulteert in verminderde prestaties.
|