2009-09-30 4 views
2

J'utilise SQL Server 2008 Enterprise + C# + ADO.Net + .Net 3.5. J'utilise le pool de connexions au côté client ADO.Net (le comportement par défaut de ADO.Net). J'utilise sp_who2 ou sys.dm_exec_connections pour trouver les numéros de connexions actifs (faites moi savoir si ma méthode pour trouver les numéros de connexion actifs est incorrecte). Si à chaque fois que je crée et ouvre un nouvel objet de connexion ADO.Net, j'aurai une instruction de fermeture correspondante pour fermer l'instance d'objet de connexion ADO.Net après avoir utilisé l'objet de connexion (pour exécuter la procédure de stockage), je suis Se demandant dans ce scénario, le numéro de connexion actif devrait toujours être 0 après que je ferme toute la connexion de mon application client ADO.Net, et si montrer le numéro de connexion actif> 0, il devrait être très bizarre?problème de fuite de connexion dans SQL Server

merci à l'avance, George

Répondre

2

Non, la piscine de connexion ADO.NET retournera votre connexion à la piscine après Close est appelée. La connexion peut ne pas être vraiment fermée à ce stade. Pour forcer la fermeture de la connexion, essayez d'effacer la piscine avant de la fermer. Essayez ceci et vous devriez voir la connexion à proximité du serveur.

var conn = new SqlConnection("a server goes here"); 
     conn.Open(); 

     SqlConnection.ClearAllPools(); 
     conn.Close(); 
+0

1. ClearAllPool signifie que lorsque nous appelons la méthode Close, la connexion physique du pool de connexions à SQL Server est récupérée? 2. Si oui, quel est l'avantage d'utiliser ClearAllPools avec Conneciton pool, maintenir la connexion ouverte est un principe de base de l'optimisation utilisant le pool de connexion? Si la connexion est fermée, aucun avantage de performance. Des commentaires? – George2

+1

1. Oui, l'appel de Close ne renvoie pas la connexion au pool. 2. J'utilise ClearAllPools puis Close avec Sql Server Express. Je vais attacher et détacher des bases de données de mon programme. Pour copier un fichier de base de données, il doit être détaché. J'utilise ClearAllPools avec Close pour libérer la connexion afin que je puisse détacher et copier les fichiers MDF. Le pool de connexion fournira des performances que l'effacer si vous devez pour une raison quelconque. – Steve

+0

Bonne réponse! J'ai marqué votre réponse comme répondue. – George2

6

Fermer libérera la connexion à être disponible pour le connection pool. Cela ne signifie pas que la connexion physique est fermée.

Assurez-vous également que le fichier .close est dans un fichier final, de sorte qu'il s'exécute à la fois sur le flux normal et lorsqu'une exception se produit.

+0

Voulez-vous dire quand je me sers sp_who2 ou sys.dm_exec_connections pour trouver des connexions actives numéros, je trouve des connexions physiques et pas les connexions à la piscine de connexion ADO.Net? – George2

+0

"Assurez-vous également que le .close est dans un", bien sûr, merci pour rappel. Des idées à ma question ci-dessus? – George2

+1

Oui. Fondamentalement, le pool de connexion est un ensemble de connexions qui sont maintenues dans le côté client, pour le serveur il n'y a pas de différence. – eglasius

4

Assurez-vous de bien fermer ou d'éliminer le SqlConnection. La suppression d'une connexion la ferme automatiquement.

using(SqlConnection connection = new SqlConnection(connectionString)) 
{ 
} //The connection will close automatically here 

Mais vous pouvez être explicite et faire encore un .Close() avant la fin de l'utilisation.

Vous pouvez également effacer toutes les connexions en attente qui ont le statut Commande En attente en appelant

SqlConnection.ClearAllPools(); 
+0

"Si vous n'avez aucun contrôle sur l'ouverture et la fermeture de la connexion", que voulez-vous dire par "contrôle"? J'écris mon code pour créer/ouvrir une instance d'objet de connexion, et je peux le fermer quand ce n'est pas nécessaire. – George2

+1

Eh bien, vous auriez pu utiliser une DLL tierce qui gère mal les connexions. –

+0

Merci, si chaque fois que je crée une nouvelle connexion à partir du pool de connexion dans mon code client ADO.Net, si le pool de connexion ne trouve pas de connexion disponible, la capacité du pool de connexion augmentera (créer une nouvelle connexion physique au serveur), est-ce vrai? Si oui, le numéro de connexion augmentera pour toujours, même si le pool de connexion est utilisé (ma compréhension précédente est que le pool de connexions contrôlera la limite supérieure des connexions à allouer, donc l'utilisation du pool de connexions n'augmentera jamais le nombre de connexions physiques). Des commentaires? – George2

Questions connexes