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ê?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top