O fechamento de uma conexão de dados em Descarte método é certo?
-
06-07-2019 - |
Pergunta
Eu tive uma suspeita de que uma conexão de banco de dados usado em um de nossos aplicativos não está sempre fechada. Fui ver o código e eu encontrei um DataProvider
classe que tem objeto SqlConnection
. A conexão é aberta no construtor dessa classe e fechado em seu método Dispose
(não julgue isso, eu sei manter uma conexão aberta é mau, não é apenas o meu código e não é o ponto da questão de qualquer maneira). O método Dispose
é implementado como esta:
protected virtual void Dispose(bool disposing)
{
if (!_disposed)
{
if (disposing)
{
if (_conn != null)
_conn.Close();
}
_disposed = true;
}
}
A questão é:
Será que sempre garantir que a conexão é fechada?
É este o direito código?
Eu acho que deveria haver _conn.Dispose()
chamado - estou certo e poderia não afetar fechar a conexão (provavelmente não)
Solução
Elimine nunca é chamado automaticamente.
A conexão não será fechado até que o método Dispose de seu objeto é explicitamente chamado, ou se a sua classe em usado em um usando () bloco
A mais seguro caminho é chamar o método dispose no seu finalizador e garantir o finalizador é suprimida quando o Dispose método é chamado.
Este artigo apresentar a maneira correta de implementar o padrão
Espero que ajude!
Cédric
Outras dicas
conn.Dispose();
irá também fechar a conexão, por isso não pode ferir alterá-lo para seguir o padrão dispor.
Mas há funcionalmente equivalente, então deve haver um problema mais onde.
http://msdn.microsoft .com / en-us / library / system.data.sqlclient.sqlconnection.close.aspx
Se o SqlConnection sai de âmbito, não vai ser fechado. Portanto, você deve fechar explicitamente a conexão chamando Close ou Descarte. Feche e Descarte são funcionalmente equivalente. Se o conexão valor agrupamento de comparticipação é definido como verdadeiro ou sim, o subjacente conexão é devolvido de volta para o pool de conexão. Por outro lado, se Pooling é definida como falsa ou não, o conexão subjacente ao servidor é fechada.