O que acontece com uma conexão de banco de dados não fechado?
-
06-07-2019 - |
Pergunta
Hoje cedo eu encontrei um bug em um dos nossos projectos - há uma conenction com banco de dados que nunca é fechado, eu quero dizer o método Close () nunca é chamado. No entanto, quando eu fechar o aplicativo, a conexão é fechada (marcada no estúdio de gerenciamento sql muitas vezes). Por quê?
Solução
A conexão será fechada quando sai do aplicativo. Leia-se sobre de SqlConnection Finalize . De documentação do MSDN para Object.Finalize :
"Durante o encerramento de um domínio de aplicação, Finalize é chamado automaticamente em objetos que não estão isentos de finalização, mesmo aqueles que ainda estão acessíveis."
Outras dicas
Outra coisa a ter em mente aqui é que na Net, você pode quebrar suas conexões em um bloco usando, e que vai fechar e descartar as suas ligações para você. Assim, a falta de um Fechar explícita () não é uma coisa ruim se você tem seus usando blocos lá ...
// this using block will auto close & dispose your connection...
using (var conn = new SqlConnection(...))
{
conn.Open();
// database code here with no explicit close
}
que é o equivalente funcional de um try / finally bloco com um conn.close no finalmente. Muitos desenvolvedores têm vista para os blocos usando - Certifique-se que você não está fazendo o mesmo neste caso
.Se você reescrever seu código para fechar suas conexões - é uma boa prática de usar Usando blocos em torno de todos os seus objetos de banco de dados (conexão, comando, leitor) para se certificar de que eles estão fechando e eliminação quando eles caem fora do âmbito da o uso de bloco. Eu definitivamente sugerem escrever aqueles em seu código em vez de apenas conn.Close () onde for necessário.
conexões SQL são caros para criar e ADO.NET usa uma técnica chamada pool de conexão que permite reutilizá-los.
MSDN :
É altamente recomendado que você sempre fechar a conexão quando você terminar de usá-lo para que ele irá ser devolvido ao pool de conexão e ser reutilizado.
Se o tamanho máximo da piscina tem sido atingido e nenhuma conexão utilizável é disponível, o pedido está na fila. o pooler seguida, tenta recuperar qualquer conexões até que o desconto de tempo está alcançado (o padrão é 15 segundos). Se o agrupador não podem satisfazer a pedido antes dos tempos de conexão para fora, uma exceção é lançada.
Quando você sair do aplicativo de uma forma regular, eu espero que os finalizadores para ser executado. Eles vão fechar a conexão se ele ainda está aberta. Só não dependem deste: isso pode levar algum tempo antes que esses finalizadores são executados em operação normal da sua aplicação, assim você estará mantendo muitas conexões abrir
.Quando o aplicativo falha, talvez o finalizador não será executado, deixando a conexão aberta após o tempo de vida da aplicação.