Come funziona il pool di connessioni ADO.Net?

Una connessione a un database è un'operazione ad alta intensità di risorse che in genere comprende pochi passaggi. È necessario stabilire un canale di comunicazione tra l'applicazione e il database prima che avvenga l'handshake iniziale con il server del database. Questo canale può essere un socket o una named pipe. Una volta stabilita la connessione e l'handshake iniziale con il server ha esito positivo, i metadati della connessione (informazioni sulla stringa di connessione per connettersi al database) vengono analizzati e la connessione al database viene autenticata dal server del database.

ADO.Net è stato a lungo uno dei framework di accesso ai dati più popolari. Il pool di connessioni è una funzionalità di ADO.Net che consente di migliorare le prestazioni di accesso ai dati nell'applicazione.

Cos'è il pool di connessioni?

Il pool di connessioni è una strategia utilizzata per ridurre al minimo il costo associato all'apertura e alla chiusura delle connessioni al database. Ti consente di riutilizzare le connessioni invece di creare nuove connessioni al database come e quando vengono richieste.

Un pool di connessioni contiene una raccolta di connessioni inattive, aperte e riutilizzabili. Il pooler gestisce il pool di connessioni e mantiene una serie di connessioni attive per ogni dato metadati di connessione, informazioni sulla configurazione della connessione.

Notare che è possibile avere più pool di connessione esistenti nello stesso dominio dell'applicazione. Viene creato un pool di connessioni per stringa di connessione univoca utilizzata per connettersi al database e non per database. Pertanto, la prima volta che ci si connette a un database con una particolare stringa di connessione, viene creato un nuovo pool di connessioni. Quando ci si connette allo stesso database con la stessa stringa di connessione la volta successiva, non viene creato alcun nuovo pool di connessioni, ma il pool di connessioni esistente viene riutilizzato.

Va notato che quando si utilizza la sicurezza integrata, viene creato un pool di connessioni per ogni utente che accede al sistema client, ovvero le connessioni vengono raggruppate in base all'identità di Windows. A questo proposito, MSDN afferma: "Quando una connessione viene aperta per la prima volta, viene creato un pool di connessioni in base a un algoritmo di corrispondenza esatta che associa il pool alla stringa di connessione nella connessione. Ogni pool di connessioni è associato a una stringa di connessione distinta. Quando viene aperta una nuova connessione, se la stringa di connessione non è una corrispondenza esatta con un pool esistente, viene creato un nuovo pool. "

Configurazione del pool di connessioni

Come controlli il comportamento del pool di connessioni? Bene, puoi gestire i pool di connessioni utilizzando determinate parole chiave nella stringa di connessione. Quelli importanti includono quanto segue:

  • ConnectionTimeout: viene utilizzato per specificare il periodo di attesa (in secondi) quando viene richiesta una nuova connessione al database. Il valore predefinito è 15.
  • MinPoolSize: rappresenta il numero minimo di connessioni nel pool.
  • MaxPoolSize: rappresenta il numero massimo di connessioni nel pool. Il valore predefinito è 100.
  • Pooling: controlla se il pool di connessioni è attivato o disattivato e può avere un valore true o false. Quando è impostato su true, la connessione richiesta viene recuperata dal pool di connessioni appropriato.

Il frammento di codice seguente illustra come configurare il pool di connessioni utilizzando la stringa di connessione:

string connectionString="Data Source=localhost;Initial Catalog=Sample; Integrated security=SSPI;Connection Timeout=30; Connection Lifetime=0;Min Pool Size=0;Max Pool Size=100;Pooling=true;";

using (SqlConnection connection = new SqlConnection(connectionString))

{

   connection.Open();

   //Write code here to perform CRUD operations on the Sample database

}

È possibile monitorare il comportamento del pool di connessioni eseguendo le stored procedure sp_who o sp_who2 in SQL Server. È inoltre possibile utilizzare SQL Server Profiler o sfruttare i contatori delle prestazioni per monitorare il comportamento del pool di connessioni.

Esistono alcuni potenziali problemi con il pool di connessioni. Uno di questi problemi è la frammentazione del pool. Quando si lavora con il pool di connessioni, è necessario essere consapevoli della frammentazione del pool e assicurarsi che vengano adottate misure adeguate (la propria architettura deve essere progettata per affrontare le strategie di mitigazione della frammentazione del pool) per evitare la frammentazione del pool. Si noti che la frammentazione del pool potrebbe verificarsi se si utilizza la sicurezza integrata o anche quando l'applicazione utilizza troppi pool di connessioni.

Per garantire che il pool di connessioni funzioni in modo efficiente, è necessario assicurarsi di chiudere le connessioni al database quando non sono più necessarie. Non dovresti mai chiamare il metodo Close o Dispose su un'istanza di Connection nel metodo Finalize. È inoltre necessario chiudere le istanze della transazione prima che gli oggetti di connessione correlati vengano chiusi o eliminati. Ecco una bella lettura su questo argomento.