2015-10-23 1 views
2

J'essaie d'optimiser les performances de mon code en accédant à la base de données SQL Server 2014 et j'ai remarqué que le regroupement de connexions ne semble pas fonctionner comme annoncé par ADO.NET. Par défaut, il est supposé être activé et fonctionner hors de la boîte (tant que la même chaîne de connexion est utilisée). Mes expériences montrent cependant que l'ouverture/fermeture de connexion sur SqlConnection provoque en fait l'inversion de connexion/déconnexion.Le pooling SqlConnection ne semble pas fonctionner

Comme par https://msdn.microsoft.com/en-us/library/vstudio/8xx3tyca(v=vs.100).aspx cela ne devrait pas être le cas:

Connexion et les événements ne seront pas de fermeture de session soulevées sur le serveur lorsqu'une connexion est récupérée et restituée au pool de connexion. Cela est dû au fait que la connexion n'est pas réellement fermée lorsqu'elle est renvoyée au pool de connexions.

Mon test simple était de créer une application console, similaire à ce qui suit:

var conn = new SqlConnection("Data Source=(local);Integrated Security=SSPI;Initial Catalog=icedb;"); 

for (int i = 0; i < 3; i++) 
{ 
    conn.Open();  
    var cmd = conn.CreateCommand(); 
    cmd.CommandText = "select 1"; 
    cmd.ExecuteScalar(); 
    conn.Close(); 
} 

exécuter ce code yeilds résultats capturés par Sql Profiler similaire à ce qui suit. Observez les événements de connexion/déconnexion de plusieurs personnes qui n'auraient pas dû être capturés si le regroupement fonctionnait comme annoncé. J'ai été capable de reproduire cela sur plusieurs machines (Windows 8/10, .NET 4.5, Sql Server 2014 Developer Edition).

enter image description here

Question principale: Comment puis-je obtenir la mise en commun de connexion pour travailler.

+0

Il se peut qu'il sélectionne une nouvelle connexion dans le pool, essayez de retarder la dernière partie de la boucle après la fermeture ou définissez la taille maximale du pool sur 1 pour voir s'il réutilise les connexions. De plus, vous devriez disposer de votre 'cmd' lorsque vous avez terminé, essayez d'encapsuler à la fois la connexion et la commande dans les instructions' using'. –

+0

Essayé tous les 3 de ces choses - aucune différence – macsux

+0

Avez-vous remarqué qu'il n'y a pas de dernière vérification de déconnexion? – Steve

Répondre

3

Si sp_reset_connection est émise, le regroupement de connexions est activé. Voir What does sp_reset_connection do?

Pour voir si un login d'audit est mis en commun ou non mis en commun dans le Générateur de profils, vous devez ajouter EventSubClass colonne à la trace et vérifiez la Connexion d'audit et d'événements Audit Déconnexion. La nouvelle colonne affichera "1 - Nonpooled" ou "2 - Pooled". Dans votre exemple, seule la première connexion a "1 - Nonpooled", les deux prochaines connexions d'audit ont EventSubClass = "2 - Pooled".

+0

Vraiment bien c'était une nouvelle pour moi – Steve