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.

image

Observe que, apesar do erro, o código funciona normalmente.

image

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.

image

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:

https://blogs.msdn.microsoft.com/fcatae/2013/12/09/the-timeout-period-elapsed-prior-to-obtaining-a-connection-from-the-pool/

Sempre use try-finally

A forma correta de escrever esse código seria:

image

Um atalho seria usar a sintaxe using:

image

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.