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 com o banco de dados de maneira 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 o Finalize()
método delas .
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 gerar Close
uma exceção:
var connection = new SqlConnection(connectionString);
connection.Open();
// some code
connection.Close();
A maneira 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 retorna uma conexão a partir de um método de classe, certifique-se de armazená-la 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 fechada. Em vez de fechar sua conexão, essa linha cria uma nova e tenta fechá-la.
Se você usar SqlDataReader
ou a OleDbDataReader
, feche-os. Mesmo que o fechamento da conexão pareça ser suficiente, faça um esforço extra para fechar explicitamente os objetos do leitor de dados quando você os usar.
Este artigo " Por que um pool de conexões transborda? " Da MSDN / SQL Magazine explica muitos detalhes e sugere algumas estratégias de depuração:
- Execute
sp_who
ou sp_who2
. Esses procedimentos armazenados do sistema retornam informações da sysprocesses
tabela do sistema que mostra o status e as informações sobre todos os processos de trabalho. Geralmente, você verá um SPID (Server Process ID) por conexão. Se você nomeou sua conexão usando o argumento Nome do Aplicativo na cadeia de conexão, será fácil encontrar suas conexões de trabalho.
- Use o SQL Server Profiler com o
TSQL_Replay
modelo SQLProfiler para rastrear conexões abertas. Se você conhece o Profiler, esse método é mais fácil do que pesquisar usando sp_who.
- Use o Monitor de desempenho para monitorar os conjuntos e conexões. Discuto esse método em um momento.
- Monitore os contadores de desempenho no código. Você pode monitorar a integridade do 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.