La fermeture d'une connexion de base de données dans la méthode Dispose est-elle correcte?
-
06-07-2019 - |
Question
Je soupçonne une connexion de base de données utilisée dans l'une de nos applications de ne pas toujours être fermée. Je suis allé voir le code et j'ai trouvé une classe DataProvider
qui a un objet SqlConnection
. La connexion est ouverte dans le constructeur de cette classe et fermée dans sa méthode Dispose
(ne jugez pas cela, je sais que garder une connexion ouverte est maléfique, ce n'est tout simplement pas mon code et ce n'est pas le but de la question quand même). La méthode Dispose
est implémentée comme suit:
protected virtual void Dispose(bool disposing)
{
if (!_disposed)
{
if (disposing)
{
if (_conn != null)
_conn.Close();
}
_disposed = true;
}
}
La question est:
Cela garantit-il toujours que la connexion est fermée?
Ce code est-il correct?
Je pense qu'il devrait y avoir _conn.Dispose ()
appelé - ai-je raison et cela pourrait-il empêcher la fermeture de la connexion (probablement pas)?
La solution
Dispose n'est jamais appelé automatiquement.
La connexion ne sera fermée que lorsque la méthode Dispose de votre objet sera explicitement appelée ou si votre classe est utilisée dans un bloc using ()
Une méthode plus sûre consiste à appeler la méthode de mise au rebut dans votre finaliseur et à vous assurer que celui-ci est supprimé lorsque la méthode Dispose est appelée.
Cet article présente la manière correcte d'implémenter le modèle
.J'espère que ça aide!
C & # 233; dric
Autres conseils
conn.Dispose ();
fermera également la connexion. Vous n'avez donc aucun mal à la changer pour suivre le modèle de disposition.
Mais leur fonctionnement est équivalent, il doit donc y avoir un problème ailleurs.
http://msdn.microsoft .com / fr-us / library / system.data.sqlclient.sqlconnection.close.aspx
Si la connexion SQL s'éteint portée, il ne sera pas fermé. Donc, vous devez explicitement fermer le connexion en appelant Close ou Disposer. Fermer et éliminer sont fonctionnellement équivalent. Si la valeur de mise en commun des connexions La mise en commun est mis à true ou oui, le sous-jacent la connexion est renvoyée à la pool de connexion. D'autre part, si La mise en commun est définie sur false ou no, le connexion sous-jacente au serveur est fermé.