Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como posso resolver um problema de pool de conexão entre ASP.NET e SQL Server?


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 ou sp_who2 . Esses procedimentos armazenados do sistema retornam informações dos sysprocesses 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.