2010-05-19 21 views

Répondre

4

Par défaut, les connexions de base de données .NET utilisent pooling. Appeler Close() et Dispose() libère juste la connexion dans le pool, il ne l'oblige pas à fermer. Finalement, il sera temps de sortir de la piscine, et effectivement être fermé.

Après un peu de recherche, il semble y avoir deux façons de l'obtenir près on pouvait s'y attendre:

  1. mise en commun Désactiver dans la chaîne de connexion - essayez d'ajouter OLE DB Services = -2;, qui devrait vous donner tous les services, sauf la mise en commun
  2. Essayez d'utiliser OleDBConnection.ReleaseObjectPool()

pour cette dernière approche que vous pourriez avoir besoin de jouer avec les délais d'attente - extrait de l'article MSDN lié:

Notez que l'appel de la méthode seule ne libère pas réellement les connexions actives qui existent dans le pool.

Les éléments suivants doivent se produire avant que la piscine soit disposé:

  1. Appel Close pour retourner l'objet de connexion à la piscine.
  2. Autoriser chaque objet de connexion à sortir du pool.
  3. Appelez ReleaseObjectPool.
  4. Invoke garbage collection.

J'ai un cas d'utilisation pour ce lieu de travail, où certains logiciels internes a besoin d'interagir avec un morceau de vieux, inflexible, floconneuse et absolument critique des logiciels propriétaires. Il doit ouvrir un fichier de base de données MDB partagé aussi rapidement que possible afin de minimiser la fenêtre où l'autre logiciel pourrait "prendre problème" (une très mauvaise chose).

Je prévois d'utiliser l'approche de la chaîne de connexion, car il semble plus simple de garantir la fermeture, et mon logiciel ne bénéficie pas vraiment du pool.

0

Je ne sais pas pourquoi votre code ne ferme pas une poignée après avoir appelé Dispose(), depuis que les appels Close() dans les coulisses, mais ce qui suit peut vous aider à écrire le code de manière fréquemment observées:

using (OleDbConnection conn = new OleDbConnection(connString)) 
{ 
    //your stuff here 
    conn.Close(); //not necessary, but doesn't hurt 
} 

Cela fermera votre handle, qu'une exception ait été levée ou non. L'utilisation de blocs permet de Fermer/Disposer les ressources à la fin du bloc.

+0

Vraiment vraiment étrange. Je suis en train de faire un appel à la fois pour disposer et fermer. – Jonn