Nos últimos dias, vemos muito esta mensagem de erro em nosso site:
"O tempo limite expirou. O período de tempo limite transcorreu antes da obtenção de uma conexão do pool. Isso pode ter ocorrido porque todas as conexões do pool estavam em uso e o tamanho máximo do pool foi atingido."
Não mudamos nada em nosso código há algum tempo. Revisei o código para verificar as conexões abertas que não foram fechadas, mas achei que tudo estava bem.
Como posso resolver isso?
Preciso editar este pool?
Como posso editar o número máximo de conexões deste pool?
Qual é o valor recomendado para um site de alto tráfego?
Atualizar:
Preciso editar algo no IIS?
Atualizar:
Descobri que o número de conexões ativas está entre 15 e 31 e descobri que o número máximo permitido de conexões configuradas no SQL Server é superior a 3200, é 31 a mais ou devo editar algo na migração de ASP.NET ?
fonte
Respostas:
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 gerarClose
uma exceção:A maneira correta seria esta:
ou
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: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 aOleDbDataReader
, 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:
sp_who
ousp_who2
. Esses procedimentos armazenados do sistema retornam informações dasysprocesses
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.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.fonte
Ao instalar o .NET Framework v4.6.1, nossas conexões com um banco de dados remoto começaram imediatamente a atingir o tempo limite devido a essa alteração .
Para corrigir, adicione o parâmetro
TransparentNetworkIPResolution
na cadeia de conexão e defina-o como false :fonte
A menos que seu uso tenha aumentado muito, parece improvável que exista apenas um acúmulo de trabalho. Na IMO, a opção mais provável é que algo esteja usando conexões e não as liberando imediatamente. Tem certeza de que está usando
using
em todos os casos? Ou (através de qualquer mecanismo) liberando as conexões?fonte
Você verificou os DataReaders que não estão fechados e o response.redirects antes de fechar a conexão ou um datareader. As conexões permanecem abertas quando você não as fecha antes de um redirecionamento.
fonte
Ocasionalmente, também encontramos esse problema em nosso site. O culpado, no nosso caso, são as nossas estatísticas / índices ficarem desatualizados. Isso faz com que uma consulta em execução anteriormente rápida se torne (eventualmente) lenta e com tempo limite.
Tente atualizar as estatísticas e / ou recriar os índices nas tabelas afetadas pela consulta e veja se isso ajuda.
fonte
Você pode especificar o tamanho mínimo e máximo do pool especificando
MinPoolSize=xyz
e / ouMaxPoolSize=xyz
na cadeia de conexão. Esta causa do problema pode ser uma coisa diferente no entanto.fonte
Também encontrei esse problema ao usar alguma camada de dados de terceiros em um dos meus aplicativos .NET. O problema era que a camada não fechava as conexões corretamente.
Jogamos fora a camada e criamos uma, que sempre fecha e descarta as conexões. Desde então, não recebemos mais o erro.
fonte
Você pode tentar isso também, para resolver o problema de tempo limite:
Se você não adicionou httpRuntime ao seu webconfig, adicione-o na
<system.web>
tage
Modifique sua string de conexão como esta;
No último uso
fonte
Isso ocorre principalmente porque a conexão não foi fechada no aplicativo. Use "MinPoolSize" e "MaxPoolSize" na cadeia de conexão.
fonte
No meu caso, eu não estava fechando o objeto DataReader.
fonte
Se você estiver trabalhando em um código legado complexo, em que um simples uso de (..) {..} não é possível - como eu era -, você pode conferir o snippet de código que publiquei nesta pergunta do SO para descobrir como pilha de chamadas da criação da conexão quando uma conexão está potencialmente vazando (não fechada após um tempo limite definido). Isso torna bastante fácil identificar a causa dos vazamentos.
fonte
Não instancie a conexão sql muitas vezes. Abra uma ou duas conexões e use-as para todas as próximas operações sql.
Parece que mesmo
Dispose
nas conexões a exceção é lançada.fonte
Além das soluções publicadas ....
Ao lidar com 1000 páginas de código legado, cada uma chamando um GetRS comum várias vezes, aqui está outra maneira de corrigir o problema:
Em uma DLL comum existente, adicionamos a opção CommandBehavior.CloseConnection :
Então, em cada página, desde que você feche o leitor de dados, a conexão também será fechada automaticamente para evitar vazamentos.
fonte
Acabei de ter o mesmo problema e queria compartilhar o que me ajudou a encontrar a fonte: Adicione o nome do aplicativo à sua cadeia de conexão e, em seguida, controle a conexão aberta com o SQL Server
fonte
Este problema eu tive no meu código. Vou colar algum código de exemplo que encontrei abaixo do erro. O período de tempo limite transcorreu antes da obtenção de uma conexão do pool. Isso pode ter ocorrido porque todas as conexões do pool estavam em uso e o tamanho máximo do pool foi atingido.
Você deseja fechar a conexão sempre. Antes disso, eu não nos fazia a conexão estreita devido a isso, recebi um erro. Depois de adicionar a instrução close, vim esse erro
fonte
Você vazou conexões no seu código. Você pode tentar usar usando para certificar que os está fechando.
https://blogs.msdn.microsoft.com/angelsb/2004/08/25/connection-pool-and-the-timeout-expired-exception-faq/
fonte
Este problema eu encontrei antes. Acabou sendo um problema com o firewall. Acabei de adicionar uma regra ao firewall. Eu tive que abrir a porta
1433
para que o servidor SQL pudesse se conectar ao servidor.fonte
Usa isto:
fonte
SqlConnection.ClearPool
, mas isso impede que sua conexão atual seja liberada de volta ao pool de conexões? Eu pensei que a idéia do pool de conexões era permitir conexões mais rápidas. Certamente, liberar a conexão da piscina toda vez que terminar significa que uma nova conexão precisará ser criada A TODA Vez que é necessária, em vez de retirar uma sobressalente da piscina? Por favor, explique como e por que essa técnica é útil.Sim, existe uma maneira de alterar a configuração. Se você estiver em um servidor dedicado e simplesmente precisar de mais conexões SQL, poderá atualizar as entradas "tamanho máximo do pool" nas duas cadeias de conexão seguindo estas instruções:
Encontre suas Strings de conexão, elas serão semelhantes aos exemplos abaixo:
"add name =" SiteSqlServer "connectionString =" server = (local); database = dbname; uid = dbuser; pwd = dbpassword; pooling = true; tempo de vida da conexão = 120; tamanho máximo do pool = 25; ""
5. Altere o valor tamanho máximo do pool = X para o tamanho necessário do pool.
fonte
Certifique-se de definir as configurações corretas para o conjunto de conexões. Isso é muito importante, como expliquei no seguinte artigo: https://medium.com/@dewanwaqas/configurations-that-significantly-improves-your-app-performance-built-using-sql-server-and-net- ed044e53b60 Você verá uma melhoria drástica no desempenho do seu aplicativo se você o seguir.
fonte
No meu caso, eu tinha um loop infinito (de uma propriedade get tentando obter valor do banco de dados) que continuava abrindo centenas de conexões SQL.
Para reproduzir o problema, tente o seguinte:
fonte