J'ai une application qui est connectée à une base de données via un spring.net AdoTemplate. Je suis chargé de créer une méthode de base de données de restauration qui permet à l'application de fonctionner mais qui supprime les connexions réseau afin de supprimer l'ancienne base de données et d'afficher la nouvelle. Ma question est comment puis-je supprimer toutes les connexions actuelles que cette application a à cet AdoTemplate? Je ne vois aucune méthode publique au printemps 1.1 pour abandonner les connexions réseau.Spring.net Supprimer toutes les connexions adotemplate?
Répondre
Ce qui a fini par travailler était grande:
SqlConnection.ClearAllPools();
// if any connections were being used at the time of the clear, hopefully waiting
// 3 seconds will give them time to be released and we can now close them as well
Thread.Sleep(3000);
//clear again
SqlConnection.ClearAllPools();
Il n'y a pas de "connexion" physique entre AdoTemplate et la base de données SQL. En laissant de côté les transactions, AdoTemplate crée un nouvel objet SqlConnection pour chaque méthode exécutée à partir d'ADO.NET, exécute une commande et supprime l'objet SqlConnection après cela. Sous les hottes, ADO.NET met en cache les connexions physiques à la base de données dans un pool. Lorsque vous créez un nouvel objet SqlConnection, une de ces connexions physiques mises en cache est obtenue à partir du pool pour servir cette SqlConnection. Cela signifie que vous aurez besoin d'une stratégie différente pour résoudre votre problème. Une stratégie qui me vient à l'esprit est d'obtenir la liste des connexions actives de la base de données sysprocesses et d'exécuter l'instruction KILL sur celles-ci. Googling courte a soulevé cette article. Notez que cet article fait référence à mssql 2000. Je suis à peu près sûr, que vous devez google un peu plus pour trouver une solution pour 2005. Depuis 2005, il n'est plus autorisé à accéder aux tables système asfair.
HTH, Erich