Question

Plus tôt aujourd'hui, j'ai trouvé un bogue dans l'un de nos projets. Il existe une connexion avec la base de données qui n'est jamais fermée. Je veux dire que la méthode Close () n'est jamais appelée. Cependant, lorsque je ferme l'application, la connexion est fermée (vérifié à plusieurs reprises dans SQL Management Studio). Pourquoi?

Était-ce utile?

La solution

La connexion sera fermée lorsque l'application sera fermée. Consultez la page Finalisation de SqlConnection . Extrait de la documentation de MSDN pour Object.Finalize :

"Lors de la fermeture d'un domaine d'application, Finalize est automatiquement appelé pour les objets qui ne sont pas exemptés de la finalisation, même ceux qui sont toujours accessibles."

Autres conseils

Une autre chose à garder à l’esprit est que, dans .Net, vous pouvez envelopper vos connexions dans un bloc using, ce qui fermera et disposera de vos connexions pour vous. Donc, l’absence de Close () explicite n’est pas une mauvaise chose si vous avez vos blocs d’utilisation ici ...

// this using block will auto close & dispose your connection...
using (var conn = new SqlConnection(...))
{
    conn.Open();
    // database code here with no explicit close

}

c'est l'équivalent fonctionnel d'un bloc try / finally avec conn.close dans le finally. De nombreux développeurs ignorent les blocs d’utilisation. Assurez-vous de ne pas faire la même chose dans ce cas.

Si vous réécrivez votre code pour fermer vos connexions, il est recommandé d'utiliser l'option Utilisation de blocs autour de tous vos objets de base de données (connexion, commande, lecteur) pour vous assurer qu'ils se ferment et se défont lorsqu'ils tombent en dehors du champ d'application. le bloc d'utilisation. Je suggérerais certainement de les écrire dans votre code au lieu de simplement conn.Close () si nécessaire.

La création de connexions SQL est coûteuse et ADO.NET utilise une technique appelée regroupement de connexions qui permet de les réutiliser.

Citation de MSDN :

  

Il est fortement recommandé de   fermez toujours la connexion quand vous   sont finis de l'utiliser pour qu'il   être retourné au pool de connexion et   être réutilisé.

     

Si la taille maximale du pool a été   atteint et aucune connexion utilisable est   disponible, la demande est mise en file d'attente. le   pooler tente ensuite de récupérer tout   connexions jusqu'à ce que le délai est   atteint (la valeur par défaut est 15 secondes).   Si le pooler ne peut pas satisfaire le   demande avant les temps de connexion   une exception est levée.

Lorsque vous quittez l'application de manière régulière, les finaliseurs doivent s'exécuter. Ils fermeront la connexion si elle est toujours ouverte. Ne vous fiez pas à cela: cela peut prendre un certain temps avant que ces finaliseurs ne s'exécutent en mode de fonctionnement normal de votre application, vous garderez donc trop de connexions ouvertes.

Lorsque l'application se bloque, le finaliseur ne s'exécutera peut-être pas, laissant la connexion ouverte au-delà de la durée de vie de l'application.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top