Dans la plupart des cas, les problèmes de regroupement de connexions sont liés à des fuites de connexion . Votre application ne ferme probablement pas ses connexions à la base de données correctement et de manière cohérente. Lorsque vous laissez des connexions ouvertes, elles restent bloquées jusqu'à ce que le ramasse-miettes .NET les ferme pour vous en appelant leur Finalize()
méthode.
Vous voulez vous assurer que vous fermez vraiment la connexion . Par exemple, le code suivant provoquera une fuite de connexion, si le code entre .Open
et Close
lance une exception :
var connection = new SqlConnection(connectionString);
connection.Open();
// some code
connection.Close();
La bonne méthode serait celle-ci :
var connection = new SqlConnection(ConnectionString);
try
{
connection.Open();
someCall (connection);
}
finally
{
connection.Close();
}
ou
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
someCall(connection);
}
Lorsque votre fonction renvoie une connexion à partir d'une méthode de classe assurez-vous de le mettre en cache localement et appelez son Close
méthode. Vous allez divulguer une connexion en utilisant ce code par exemple :
var command = new OleDbCommand(someUpdateQuery, getConnection());
result = command.ExecuteNonQuery();
connection().Close();
La connexion renvoyée par le premier appel à getConnection()
n'est pas fermé. Au lieu de fermer votre connexion, cette ligne en crée une nouvelle et tente de la fermer.
Si vous utilisez SqlDataReader
ou un OleDbDataReader
, fermez-les. Même si la fermeture de la connexion elle-même semble faire l'affaire, faites l'effort supplémentaire de fermer explicitement vos objets de lecteur de données lorsque vous les utilisez.
Cet article « Pourquoi un pool de connexions déborde-t-il ? » de MSDN/SQL Magazine explique beaucoup de détails et suggère quelques stratégies de débogage :
- Exécuter
sp_who
ousp_who2
. Ces procédures stockées système renvoient des informations desysprocesses
table système qui affiche l'état et les informations sur tous les processus de travail. Généralement, vous verrez un ID de processus serveur (SPID) par connexion. Si vous avez nommé votre connexion en utilisant l'argument Nom de l'application dans la chaîne de connexion, vos connexions de travail seront faciles à trouver. - Utiliser SQL Server Profiler avec SQLProfiler
TSQL_Replay
modèle pour tracer les connexions ouvertes. Si vous connaissez Profiler, cette méthode est plus simple que l'interrogation à l'aide de sp_who. - Utilisez l'Analyseur de performances pour surveiller les pools et les connexions. Je discute de cette méthode dans un instant.
- Surveiller les compteurs de performances dans le code. Vous pouvez surveiller la santé de votre pool de connexions et le nombre de connexions établies en utilisant des routines pour extraire les compteurs ou en utilisant les nouveaux contrôles .NET PerformanceCounter.