Nella maggior parte dei casi, i problemi relativi al pool di connessioni sono correlati a perdite di connessione . La tua applicazione probabilmente non chiude le sue connessioni al database in modo corretto e coerente. Quando lasci le connessioni aperte, rimangono bloccate fino a quando il Garbage Collector .NET non le chiude 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 tua funzione restituisce una connessione da un metodo di classe assicurati di memorizzarlo nella cache in locale e di chiamarlo Close
metodo. Perderai una connessione usando questo codice, ad esempio:
var command = new OleDbCommand(someUpdateQuery, getConnection());
result = command.ExecuteNonQuery();
connection().Close();
La connessione restituita dalla prima chiamata a getConnection()
non viene chiuso. Invece di chiudere la tua connessione, questa linea ne crea una nuova e prova a chiuderla.
Se usi SqlDataReader
o un OleDbDataReader
, chiudili. Anche se la chiusura della connessione stessa sembra fare il trucco, fai lo sforzo extra per chiudere gli oggetti del tuo lettore di dati in modo esplicito quando li usi.
Questo articolo "Perché un pool di connessioni va in overflow?" da MSDN/SQL Magazine spiega molti dettagli e suggerisce alcune strategie di debug:
- Esegui
sp_who
osp_who2
. Queste stored procedure di sistema restituiscono informazioni dasysprocesses
tabella di sistema che mostra lo stato e le informazioni su tutti i processi di lavoro. In genere, vedrai un ID processo server (SPID) per connessione. Se hai assegnato un nome alla tua connessione utilizzando l'argomento Nome applicazione nella stringa di connessione, le tue connessioni funzionanti saranno facili da trovare. - Utilizzare SQL Server Profiler con SQLProfiler
TSQL_Replay
modello per tracciare le 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.
- Monitoraggio dei contatori delle prestazioni nel codice. Puoi monitorare lo stato del tuo pool di connessioni e il numero di connessioni stabilite utilizzando le routine per estrarre i contatori o utilizzando i nuovi controlli .NET PerformanceCounter.