Il pooling delle connessioni rappresenta una funzionalità eccezionale di ADO.NET.
Consente di riutilizzare in modo trasparante una connessione ad un database quando questa non è più necessaria all’applicazione.
Il meccanismo funziona in questi termini:
non appena si apre la prima connessione al database, viene creato un pool di connessioni identiche, in modo che le richieste seguenti non debbano aspettare di ottenere una connessione valida.
Quando l’applicazione completa tutte le operazioni sul database, deve chiudere esplicitamente l’oggetto Connection per restituirlo al pool e renderlo disponibile ad altre applicazioni. ADO.NET crea un numero di pool di connessioni pari al numero di stringhe di connessione distinte utilizzate dal programma, pertanto la condizione necessaria per poter sfruttare il pool è quella di aprire tutte le connessioni a database utilizzando esattamente la stessa stringa di connessione.
Dal momento che basta uno spazio un punto e virgola in più per rendere diversa una stringa dall’altra, occorre prestare davvero molta attenzione. Questa condizione fa si che sia impossibile sfruttare i vantaggi del pooling di connessioni nel caso in cui vengano specificati uno username o una password differenti nella stringa di connessione.
Sarebbe bene, pertanto, adottare la sicurezza integrata di di Windows invece della sicurezza a livello di database tutte le volte che ciò è accettabile.
Un altro approccio sicuro al pooling delle connessioni consiste nell’incapsulare tutti gli accessi al database in una componente .NET che effettui la registrazione al database utilizzando un account particolare e sfrutti, pertanto, la stessa strnga di connessione per tutte le proprie connessioni aperte.
L’OLE DB.NET Data Provider, crea un pool di connessioni basato sul pooling delle connessioni OLEDB. Il pooling delle connessioni è abilitato di default, ma può essere disabilitato specificando un particolare valore OLE DB Services nella stringa di connessione. Ole DB Services=-4 L’oggetto OleDbConnection espone un metodo ReleaseObjectPool che elimina tutte le connessioni inutilizzate dal pool. E’ possibile inbocare questo metodo e quindi il metodo GC.Collect per liberare il maggior numero di risorse possibile. Il SQL Server .NET Data Provider mette a disposizione un pooling di connessioni basato sui Component Services, utilizzando un modello di pooling implicito predefinito. In questo modo, se il thread corrente ha già aperto una transazione utilizzando il provider in questione, ogni nuova transazione aperta corrisponderà allo stesso contesto transazionale.
Quando il thread richiede una connessione, viene esamitato il pool per trovare l’oggetto Connection adatto. Per potere essere riutilizzata, una connessione del pool deve possedere esattamente la stessa stringa di connessione, deve avere un contesto transazionale corrpispondente e un colegamento valido a un server specificato. Per controllare il comportamento del pooling di conessioni con il SQL Server .NET Data Provider è possibile utilizzare diversi valori nella stringa di connessione. Ad esempio. È possibile disabiltiare la registrazione automatica nel pooling impostando l’attributo Pooling a False;
Pooling = False;