Nella maggior parte dei casi i problemi di pool di connessioni sono correlati a "perdite di connessione". Probabilmente l'applicazione non chiude le connessioni al database in modo corretto e coerente. Quando si lasciano aperte le connessioni, rimangono bloccate fino a quando il Garbage Collector .NET non le chiude per sé chiamando il loro Finalize()
metodo.
Vuoi assicurarti di chiudere davvero la connessione . Ad esempio, il codice seguente causerà una perdita di connessione, se il codice tra .Open
e Close
genera un'eccezione:
var connection = new SqlConnection(connectionString);
connection.Open();
// some code
connection.Close();
Il modo corretto sarebbe questo:
var connection = new SqlConnection(ConnectionString);
try
{
connection.Open();
someCall (connection);
}
finally
{
connection.Close();
}
o
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
someCall(connection);
}
Quando la funzione restituisce una connessione da un metodo di classe, assicurati di memorizzarla nella cache locale e di chiamarne il Close
metodo. Perderai una connessione usando questo codice per esempio:
var command = new OleDbCommand(someUpdateQuery, getConnection());
result = command.ExecuteNonQuery();
connection().Close();
La connessione restituita dalla prima chiamata a getConnection()
non viene chiusa. Invece di chiudere la connessione, questa linea ne crea una nuova e cerca di chiuderla.
Se usi SqlDataReader
o a OleDbDataReader
, chiudili. Anche se chiudere la connessione stessa sembra fare il trucco, sforzati di chiudere esplicitamente gli oggetti del tuo lettore di dati quando li usi.
Questo articolo " Perché un pool di connessioni trabocca? " Dalla rivista MSDN / SQL spiega molti dettagli e suggerisce alcune strategie di debug:
- Esegui
sp_who
o sp_who2
. Queste procedure memorizzate dal sysprocesses
sistema restituiscono informazioni dalla tabella di sistema che mostra lo stato e le informazioni su tutti i processi lavorativi. In genere, vedrai un ID processo server (SPID) per connessione. Se la connessione è stata denominata utilizzando l'argomento Nome applicazione nella stringa di connessione, sarà facile trovare le connessioni funzionanti.
- Utilizzare SQL Server Profiler con il
TSQL_Replay
modello SQLProfiler per tracciare connessioni aperte. Se hai familiarità con Profiler, questo metodo è più semplice del polling utilizzando sp_who.
- Utilizzare Performance Monitor per monitorare i pool e le connessioni. Discuterò questo metodo tra un momento.
- Monitorare i contatori delle prestazioni nel codice. È possibile monitorare l'integrità del pool di connessioni e il numero di connessioni stabilite utilizzando le routine per estrarre i contatori o utilizzando i nuovi controlli .NET PerformanceCounter.