Na maioria dos casos, os problemas de pool de conexão estão relacionados a vazamentos de conexão . Seu aplicativo provavelmente não fecha suas conexões de banco de dados de forma correta e consistente. Quando você deixa as conexões abertas, elas permanecem bloqueadas até que o coletor de lixo .NET as feche para você chamando seu
Finalize()
método. Você quer ter certeza de que está realmente fechando a conexão . Por exemplo, o código a seguir causará um vazamento de conexão, se o código entre
.Open
e Close
lança uma exceção:var connection = new SqlConnection(connectionString);
connection.Open();
// some code
connection.Close();
A forma correta seria esta:
var connection = new SqlConnection(ConnectionString);
try
{
connection.Open();
someCall (connection);
}
finally
{
connection.Close();
}
ou
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
someCall(connection);
}
Quando sua função retornar uma conexão de um método de classe certifique-se de armazená-lo localmente e chamar seu
Close
método. Você vazará uma conexão usando este código, por exemplo:var command = new OleDbCommand(someUpdateQuery, getConnection());
result = command.ExecuteNonQuery();
connection().Close();
A conexão retornada da primeira chamada para
getConnection()
não está sendo fechado. Em vez de fechar sua conexão, esta linha cria uma nova e tenta fechá-la. Se você usa
SqlDataReader
ou um OleDbDataReader
, feche-os. Mesmo que fechar a conexão em si pareça resolver o problema, faça um esforço extra para fechar seus objetos de leitura de dados explicitamente ao usá-los. Este artigo "Por que um pool de conexões estoura?" da MSDN/SQL Magazine explica muitos detalhes e sugere algumas estratégias de depuração:
- Execute
sp_who
ousp_who2
. Esses procedimentos armazenados do sistema retornam informações dossysprocesses
tabela do sistema que mostra o status e informações sobre todos os processos de trabalho. Geralmente, você verá um ID de processo do servidor (SPID) por conexão. Se você nomeou sua conexão usando o argumento Application Name na string de conexão, suas conexões de trabalho serão fáceis de encontrar. - Usar o SQL Server Profiler com o SQLProfiler
TSQL_Replay
modelo para rastrear conexões abertas. Se você estiver familiarizado com o Profiler, esse método é mais fácil do que pesquisar usando sp_who. - Use o Monitor de desempenho para monitorar os pools e as conexões. Discutirei esse método em breve.
- Monitore os contadores de desempenho no código. Você pode monitorar a integridade de seu pool de conexões e o número de conexões estabelecidas usando rotinas para extrair os contadores ou usando os novos controles .NET PerformanceCounter.