Ne fermer une connexion de base de données dans la méthode dispose est la bonne?
J'ai eu des soupçons sur une connexion de base de données utilisé dans l'une de nos applications n'est pas toujours fermée. Je suis allé voir le code et j'ai trouvé une classe DataProvider
qui a SqlConnection
objet. Le lien est ouvert dans le constructeur de cette classe et fermé dans Dispose
méthode (ne juge pas, je sais garder une connexion ouverte est le mal, c'est juste pas mon code et il n'est pas le point de la question de toute façon). Le Dispose
méthode est implémentée comme ceci:
protected virtual void Dispose(bool disposing)
{
if (!_disposed)
{
if (disposing)
{
if (_conn != null)
_conn.Close();
}
_disposed = true;
}
}
La question est:
Est-il toujours garantir que la connexion est fermée?
Est-ce un bon code?
Je pense qu'il devrait être _conn.Dispose()
appelle - suis-je en droit et cela pourrait-il affecter la non fermeture de la connexion (probablement pas)?
Une valeur de la clé de contrôle est NumberOfPooledConnections.
OriginalL'auteur agnieszka | 2009-06-19
Vous devez vous connecter pour publier un commentaire.
Disposer est jamais appelé automatiquement.
La connexion ne sera pas fermée jusqu'à ce que la méthode dispose de l'objet est appelé explicitement, ou si votre classe est utilisé en une à l'aide de() bloc
Un moyen plus sûr est d'appeler la méthode dispose dans votre outil de finalisation et d'assurer le finaliseur est supprimé lorsque la méthode dispose est appelée.
Cet article présenter la bonne façon de mettre en œuvre le modèle
Espère que cela aide !
Cédric
Lorsque votre application est à l'arrêt, tous les finaliseurs doit être appelé par le garbage collector, donc au moins les connexions seront fermés comme le finaliseur les objets de Connexion sera déclenchée... mais c'est une lame de façon à fermer une connexion ;o)
Et par la façon de Jeter de la méthode ne sont jamais appelés automatiquement. Dans l'état actuel du code, les connexions sont fermées à cause de la méthode dispose de Connexion est appelé dans leur finaliseurs
je sais, c'est pas mon code comme je l'ai déjà dit 😉
voulez-vous dire que cette méthode sera jamais appelé de toute façon?
OriginalL'auteur Cédric Rup
conn.Dispose();
sera aussi fermer la connexion, donc peut pas faire de mal de changer de suivre le modèle dispose.Mais fonctionnellement équivalents, donc il doit y avoir un problème ailleurs.
http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.close.aspx
OriginalL'auteur Hath