Astratto Oggi parlerò dei pool di connessione a database. Ad essere onesto, ho detto che la pera d'anatra è molto grande. Perché i pool di connessione sono relativamente difficili da capire rispetto ad altri capitoli. Voglio spiegartelo con le frasi più popolari, ma non è un compito facile. Tuttavia, i pool di connessione sono anche un punto di conoscenza molto importante, specialmente quando si implementano programmi multiutente. Perciò, non solo devo parlare, ma anche parlare a fondo. Attraverso questo articolo comprenderai i fondamenti del connection pooling e come sia già sfruttato per migliorare le prestazioni della tua applicazione.
Indice Cos'è un pool di connessioni? Come funziona il pool di connessione Parliamo di alcune proprietà molto importanti dei pool di connessione Eccezioni del pool di connessione e metodi di gestione Un modo per monitorare lo stato della tua connessione Principi di base per un uso efficiente dei pool di connessione 1. Cos'è un pool di connessione? Nel precedente articolo, "ADO.NET Must Know (4) Taste Connection Objects", ho sottolineato che stabilire una connessione a un database è una cosa molto dispendiosa in termini di tempo (che richiede tempo) e che richiede molto lavoro (risorse). Questo perché la connessione a un server di database comporta diversi processi lunghi: stabilire un canale fisico (come un socket o una pipeline nominata), effettuare una stretta di mano iniziale con il server, analizzare le informazioni sulla stringa di connessione, far autenticare la connessione dal server, eseguire un controllo per registrare la transazione corrente e così via. Indipendentemente dal motivo per cui esista un tale meccanismo, c'è sempre una ragione per esistere. Dato che creare una nuova connessione è così dolorosa, perché non riutilizzare una già esistente?
In effetti, ADO.NET ci fornisce già un metodo di ottimizzazione chiamato connection pooling. Un pool di connessioni è uno di questi container: ospita un certo numero di connessioni fisiche al server del database. Pertanto, quando dobbiamo connetterci al server del database, basta disattivare una connessione libera dal pool (container) invece di crearne una nuova. Questo riduce notevolmente il sovraccarico della connessione al database, migliorando le prestazioni dell'applicazione.
PS:本来做了2张图片来描述连接池的,无奈公司装有监控软件,不能上传,所以只能等下次有时间上传了。
2. Come funziona il pool di connessione 2.1 Creare un pool di connessione Va notato che i pool di connessione sono sensibili alle classi. Cioè, lo stesso dominio applicativo può avere diversi tipi di pool di connessione contemporaneamente. Quindi, come vengono identificati i pool di connessioni? In dettaglio, si distingue dalla firma che forma il processo, il dominio applicativo, la stringa di connessione e l'identità di Windows (quando si utilizza la sicurezza integrata). Tuttavia, per lo stesso dominio applicativo, generalmente viene identificata solo dalla stringa di connessione. Quando si apre una connessione, viene creato un nuovo pool di connessione se la firma di tipo della connessione a striscia non corrisponde al tipo del pool di connessione esistente. altrimenti, non viene creato alcun nuovo pool di connessioni.
Un esempio tipico di come creare una connessione:
Nel caso sopra, ho creato tre oggetti SqlConnection, ma sono stati necessari solo due pool di connessione per gestirli. Attenti amici, potresti aver già scoperto che conn1 e conn3 hanno la stessa stringa di connessioni, quindi possono condividere un pool di connessioni, mentre conn2 e conn1 sono diversi da conn3, quindi devi creare un nuovo pool di connessioni.
2.2 Allocazione delle connessioni inattive Quando un utente crea una richiesta di connessione o chiama l'Open of a Connection object, il gestore del pool di connessione deve prima trovare un pool di connessione del tipo corrispondente basandosi sulla firma di tipo della richiesta di connessione, e poi provare ad allocare una connessione libera. I dettagli sono i seguenti:
Se c'è una connessione disponibile nel pool, restituisci la connessione. Se tutte le connessioni nella piscina sono esaurite, crea una nuova connessione da aggiungere alla piscina. Se si raggiunge il numero massimo di connessioni nel pool, la richiesta entra in coda in attesa finché non ci sono connessioni libere. 2.3 Rimuovere connessioni non valide Connessioni non valide, cioè connessioni che non si collegano correttamente al server del database. Per i pool di connessioni, il numero di connessioni memorizzate al server di database è limitato. Pertanto, se le connessioni non valide non vengono rimosse nel tempo, lo spazio nel pool di connessioni sarà sprecato. In effetti, non devi preoccuparti, il gestore del pool di connessioni ha gestito questi problemi molto bene per noi. Se una connessione è inattiva per un periodo prolungato, o se rileva che la connessione al server è disconnessa, il gestore del pool di connessioni rimuove la connessione dal pool.
2.4 Ricicla le connessioni usate Quando finiamo di usare una connessione, dovremmo chiuderla o rilasciarla in tempo affinché la connessione possa essere riportata alla piscina per il riutilizzo. Possiamo chiudere la connessione tramite il metodo Chiudi o Dispose dell'oggetto Connessione, oppure tramite l'istruzione using in C#.
3. Parlami di alcune caratteristiche molto importanti Il comportamento del pool di connessione può essere controllato da stringhe di connessione e include principalmente quattro proprietà importanti:
Timeout della connessione: Il tempo in cui la richiesta di connessione deve aspettare un timeout. Il valore predefinito è 15 secondi in secondi. Dimensione massima del pool: Il numero massimo di connessioni nel pool di connessioni. Il valore predefinito è 100. Dimensione minima del pool: Il numero minimo di connessioni nel pool di connessioni. Il valore predefinito è 0.
Pooling: 是否启用连接池。ADO.NET默认是启用连接池的,因此,你需要手动设置Pooling=false来禁用连接池。 Prendiamo un esempio per comprendere le proprietà del pool di connessioni. Il codice è il seguente:
4. Eccezioni del pool di connessione e metodi di gestione Quando un utente apre una connessione senza chiuderla correttamente o in modo tempestivo, spesso scatena il problema della "perdita di connessione". La connessione pervasa rimane aperta fino a quando non viene attivato il metodo Dispos, e il Garbage Collector (GC) chiude e rilascia la connessione. A differenza di ADO, ADO.NET deve chiudere manualmente le connessioni usate. Un mito importante è che la connessione sia chiusa quando l'oggetto connesso è fuori dall'ambito locale. Infatti, quando è fuori dall'ambito, viene rilasciato solo l'oggetto di connessione, non la risorsa di connessione. Bene, diamo prima un'occhiata a un esempio.
Per rendere i risultati più evidenti, ho impostato appositamente il numero massimo di connessioni a 5 e il tempo di timeout è di 1 secondo. Dopo la corsa, i seguenti risultati vengono ottenuti rapidamente.
Dai risultati sopra descritti, è chiaro che c'è un'anomalia nella connessione. Sappiamo già che il numero massimo di connessioni nel pool di connessioni è 5, e quando viene creata la sesta connessione, è necessario attendere che la connessione scada, perché il numero massimo di connessioni nel pool ha raggiunto il numero massimo e non ci sono connessioni libere. Quando il timeout viene superato, apparirà l'eccezione di connessione menzionata sopra. Pertanto, devo sottolineare ancora una volta che le connessioni usate dovrebbero essere chiuse correttamente e rilasciate il prima possibile.
5. Metodi per monitorare lo stato delle connessioni SQL Server (1) Attraverso il monitor di attività Passo 1: Apri il Manager MSSMS e clicca sull'icona "Activity Monitor".
Passo 2: Nella vista Monitor Attività Aperto, clicca sulla scheda Processi.
Passo 3: Esegui l'esempio in #4 Eccezioni e Metodi di Gestione del Pool di Connessioni, puoi vedere le 5 connessioni aperte come mostrato nella figura sottostante.
(2) Utilizzare istruzioni T-SQL Allo stesso modo, eseguendo la stored procedure di sistema sp_who possiamo anche monitorare lo stato della connessione.
6. Principi di base per un uso efficiente dei pool di connessione Sfruttare bene il pool di connessioni migliorerà notevolmente le prestazioni della tua applicazione. Al contrario, se usata in modo errato, non farà alcun danno. In generale, i seguenti principi devono essere seguiti:
Richiedi una connessione al momento più tardivo, rilascia la connessione il prima possibile. Quando chiudi la connessione, chiudi prima la transazione definita dall'utente pertinente. Assicurati e mantieni almeno una connessione aperta nel pool di connessioni. Cerca di evitare i detriti della piscina. Questo include principalmente la frammentazione del pool generata dalla sicurezza integrata e la frammentazione del pool generata dall'uso di molti database. Consiglio: La frammentazione dei pool è un problema comune in molte applicazioni web, e le applicazioni possono creare un gran numero di pool che non vengono rilasciati fino all'uscita del processo. In questo modo, si apriranno un gran numero di connessioni, occupando molta memoria e con conseguente riduzione delle prestazioni.
|