Exceptions: The timeout period elapsed prior to obtaining a connection from the pool
Use try-finally para resolver seu problema de “The timeout period elapsed prior to obtaining a connection from the pool”.
Já comentei nos artigos anteriores sobre as construções:
Dessa vez vou falar quando usar o try-finally.
Exemplo
Criei um programa que executa uma Stored Procedure no SQL Server. A versão é bastante simplificada, mas ela tem um erro grave. Procure o problema no código abaixo.
Observe que, apesar do erro, o código funciona normalmente.
Encontrou o trecho incorreto?
Problema
Quando codificamos, sempre pensamos no “caminho feliz”, quando tudo dá certo. Entretanto, é possível que determinados comandos falhem. Por exemplo, o método cmd.ExecuteNonQuery pode gerar exceções por diversos motivos: comando inexistente, acesso negado, timeout.
Se houver uma SqlException durante a execução desse comando, a conexão não será fechada. Isso significa que a conexão aberta pelo método conn.Open não será encerrada por conn.Close.
Repetimos essa operação 100 vezes e temos a seguinte mensagem:
Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached.
Esse erro não é novo. Já havia comentado antes:
Sempre use try-finally
A forma correta de escrever esse código seria:
Um atalho seria usar a sintaxe using:
Nesse caso, o método Dispose é automaticamente chamado e fecha a conexão correspondente.
Conclusão
Se você recebeu o erro “Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached”, então a causa mais provável é que esqueceu de fazer o Dispose do objeto SqlConnection.
Note que eu poderia ter usado try-finally ou using para o objeto SqlCommand. Por que usar ou não usar? Deixarei isso para um próximo artigo.