Pool di connessioni OLEDB, ODBC e Oracle (ADO.NET)
Il pool di connessioni consente di migliorare notevolmente le prestazioni e di aumentare la scalabilità dell'applicazione. In questa sezione viene descritto il pool di connessioni per i provider di dati .NET Framework per OLE DB, ODBC e Oracle.
Pool di connessioni per OleDb
Il provider di dati .NET Framework per OLE DB esegue automaticamente il pool di connessioni utilizzando i pool di sessioni OLE DB. È possibile utilizzare gli argomenti di tipo stringa di connessione per abilitare o disabilitare i servizi OLE DB, incluso il pool. La stringa di connessione seguente, ad esempio, disabilita il pool di sessioni OLE DB e l'inserimento automatico negli elenchi delle transazioni.
Provider=SQLOLEDB;OLE DB Services=-4;Data Source=localhost;Integrated Security=SSPI;
Al termine dell'utilizzo chiudere o eliminare sempre la connessione, in modo da restituirla al pool. Le connessioni che non vengono chiuse in modo esplicito potrebbero non essere restituite al pool. Ad esempio, una connessione che esce dall'ambito ma non viene chiusa in modo esplicito verrà restituita al pool di connessioni solo se è stata raggiunta la dimensione massima del pool e la connessione è ancora valida.
Per ulteriori informazioni sul pool di sessioni OLE DB o sul pool di risorse, nonché su come disabilitare il pool eseguendo l'override dei valori predefiniti dei servizi del provider OLE DB, vedere OLE DB Programmer's Reference in MSDN Library (informazioni in lingua inglese).
Pool di connessioni per Odbc
Il pool di connessioni per il provider di dati .NET Framework per ODBC è gestito da Gestione driver ODBC, che viene utilizzato anche per la connessione e non è influenzato dal provider di dati .NET Framework per ODBC.
Per abilitare o disabilitare il pool di connessioni, aprire Amministratore origine dati ODBC disponibile nella cartella Strumenti di amministrazione in Pannello di controllo. Nella scheda Pool di connessioni è possibile specificare i parametri del pool di connessioni per ogni driver ODBC installato. Notare che le modifiche apportate al pool di connessioni per uno specifico driver ODBC avranno effetto su tutte le applicazioni che utilizzano tale driver ODBC.
Per ulteriori informazioni sul pool di connessioni ODBC, vedere INFO: Frequently Asked Questions About ODBC Connection Pooling in MSDN Library (informazioni in lingua inglese).
Pool di connessioni per client Oracle
Il provider di dati .NET Framework per Oracle fornisce automaticamente pool di connessioni per l'applicazione client ADO.NET. È possibile inoltre specificare diversi modificatori delle stringhe di connessione per controllare il comportamento del pool. Per ulteriori informazioni, vedere "Controllo del pool di connessioni con le parole chiave delle stringhe di connessione" in questo argomento.
Creazione e assegnazione di pool
Quando viene aperta una connessione, viene creato un pool di connessioni in base a un algoritmo esattamente corrispondente che associa il pool alla stringa di connessione. Ogni pool di connessioni è associato a una stringa di connessione distinta. Quando viene aperta una nuova connessione, se la stringa di connessione non corrisponde esattamente a un pool esistente, viene creato un nuovo pool.
Una volta creati, i pool di connessioni non vengono eliminati fino a quando non termina il processo attivo. Per i pool che restano inattivi o vuoti vengono utilizzate pochissime risorse di sistema.
Aggiunta di connessioni
Per ogni stringa di connessione univoca viene creato un pool di connessioni. Quando si crea un pool, vengono creati e aggiunti al pool più oggetti connessione in modo da soddisfare il requisito relativo alle dimensioni minime del pool. Le connessioni vengono aggiunte al pool in base alle necessità, fino a raggiungere le dimensioni massime del pool.
Quando viene richiesto un oggetto OracleConnection, esso viene ottenuto dal pool se è disponibile una connessione utilizzabile. Per essere utilizzabile, la connessione non deve essere in uso, deve disporre di un contesto di transazione corrispondente oppure non deve essere associata ad alcun contesto di transazione e deve disporre, infine, di un collegamento valido al server.
Se le dimensioni massime del pool sono state raggiunte e non è disponibile alcuna connessione utilizzabile, la richiesta viene accodata. Con la funzione di pool delle connessioni questi requisiti vengono soddisfatti tramite la riallocazione delle connessioni rilasciate nel pool. Una volta chiuse o eliminate, le connessioni vengono rilasciate nel pool.
Rimozione della connessione
La funzione di pool delle connessioni rimuove una connessione dal pool dopo un periodo di inattività prolungato o se rileva che la connessione al server è stata interrotta. Notare che questa condizione può essere rilevata solo dopo un tentativo di comunicare con il server. Se viene individuata una connessione al server che non è più attiva, la connessione viene contrassegnata come non valida. La funzione di pool delle connessioni analizza periodicamente i pool di connessioni alla ricerca di oggetti che sono stati rilasciati nel pool e che sono contrassegnati come non validi. Queste connessioni vengono rimosse in modo permanente.
Se esiste una connessione a un server non più disponibile, la connessione può essere recuperata dal pool anche se nessuna connessione è stata rilevata come interrotta e pertanto non è stata contrassegnata come non valida. Quando si verifica questa situazione, viene generata un'eccezione. È necessario, tuttavia, chiudere la connessione in modo da rilasciarla nel pool.
Non chiamare Close o Dispose su un oggetto Connection, DataReader o su qualsiasi altro oggetto gestito nel metodo Finalize della classe. Rilasciare nei finalizzatori solo le risorse non gestite che la classe controlla direttamente. Se nella classe non sono presenti risorse non gestite, non includere un metodo Finalize nella relativa definizione della classe. Per ulteriori informazioni, vedere Garbage Collection.
Supporto di transazioni
Le connessioni vengono recuperate dal pool e assegnate in base al contesto della transazione. Il contesto del thread richiedente e la connessione assegnata devono corrispondere. Pertanto ogni pool di connessioni viene effettivamente suddiviso in connessioni senza alcun contesto di transazione associato e in N suddivisioni, ognuna delle quali contiene connessioni con un particolare contesto di transazione.
Una volta chiusa, la connessione viene rilasciata nel pool e nella suddivisione appropriata in base al relativo contesto di transazione. La connessione può quindi essere chiusa senza generare un errore anche se è ancora in sospeso una transazione distribuita. Questo sistema consente di eseguire o interrompere la transazione distribuita in un secondo momento.
Controllo del pool di connessioni con parole chiave delle stringhe di connessione
La proprietà ConnectionString dell'oggetto OracleConnection supporta le coppie chiave/valore della stringa di connessione che possono essere utilizzare per regolare il comportamento della logica del pool di connessioni.
Nella tabella seguente sono descritti i valori ConnectionString che consentono di regolare il comportamento del pool di connessioni.
Nome |
Valore predefinito |
Descrizione |
---|---|---|
Connection Lifetime |
0 |
Quando una connessione viene restituita al pool, l'ora di creazione viene confrontata con l'ora corrente e la connessione viene eliminata se l'intervallo è superiore al valore in secondi della durata della connessione specificato da Connection Lifetime. Questa è utile nelle configurazioni cluster per applicare il bilanciamento del carico tra un server in esecuzione e un server appena portato online. Un valore zero (0) imposta il timeout massimo delle connessioni in pool. |
Enlist |
'true' |
Se l'impostazione è true, la funzione di pool inserisce automaticamente la connessione nel contesto della transazione corrente del thread di creazione, se è disponibile un contesto di transazione. |
Max Pool Size |
100 |
Numero massimo di connessioni consentite nel pool. |
Min Pool Size |
0 |
Numero minimo di connessioni gestite nel pool. |
Pooling |
'true' |
Se l'impostazione è true, la connessione viene recuperata dal pool appropriato o, se necessario, creata e aggiunta al pool appropriato. |
Vedere anche
Concetti
Contatori delle prestazioni (ADO.NET)