242 votes

Comment est-ce que je peux résoudre un problème de pool de connexion entre ASP.NET et SQL Server ?

Depuis quelques jours, nous voyons ce message d'erreur dans notre site web trop:

"Délai d'attente expiré. Le délai d'attente s'est écoulé avant l'obtention d'un connexion à partir de la piscine. Cela peut avoir lieu, car tout mis en commun les connexions étaient en cours d'utilisation et max de la piscine la taille a été atteint."

Nous n'avons pas changé quoi que ce soit dans notre code. J'ai revu le code pour vérifier les connexions ouvertes qui ne se ferme pas, mais tout trouvé pour être bien.

  • Comment puis-je résoudre ce problème?

  • Dois-je modifier cette piscine?

  • Comment puis-je modifier cela de la piscine, nombre max de connexions?

  • Quelle est la valeur recommandée pour une grande trafic de site web?


Mise à jour:

Dois-je modifier quelque chose dans IIS?

Mise à jour:

J'ai trouvé que le nombre de connexions actives sont n'importe où de 15 à 31, et j'ai trouvé que le max autorisé nombre de connexions configurées dans SQL server est plus de 3200 connexions, c'est de 31 trop ou dois-je modifier quelque chose dans le ASP.NET configration?

247voto

splattne Points 48126

Dans la plupart des cas, le regroupement de connexion, les problèmes liés à la connexion "fuites." Votre demande n'a probablement pas fermer ses connexions de base de données correctement et de manière cohérente. Lorsque vous quittez les connexions ouvertes, ils restent bloqués jusqu'à ce que l' .NET garbage collector ferme pour vous en les appelant par leurs Finalize() méthode.

Vous voulez vous assurer que vous êtes vraiment à la fermeture de la connexion. Par exemple, le code suivant provoque une fuite dans le joint, si le code entre .Open et Close déclenche une exception:

SqlConnection myConnection = new SqlConnection(ConnectionString);
myConnection.Open();
// some code
myConnection.Close();                

La manière correcte est celle-ci:

SqlConnection myConnection = new SqlConnection(ConnectionString);
try
{
     conn.Open();
     someCall (myConnection);
}
finally
{
     myConnection.Close();                
}

ou

using (SqlConnection myConnection = new SqlConnection(ConnectionString))
{
     myConnection.Open();
     someCall(myConnection);
}

Lorsque votre fonction retourne une connexion à partir d'une méthode de classe, assurez-vous de mettre en cache localement et appeler sa Close méthode. Vous aurez fuite d'une connexion à l'aide de ce code par exemple:

myCommand = new OleDbCommand(SomeUpdateQuery, getConnection());
result = myCommand.ExecuteNonQuery();
myConnection().Close(); 

La connexion de rentrer du premier appel à getConnection() n'est pas fermé. Au lieu de fermer votre connexion, cette ligne crée une nouvelle et essaie de la fermer.

Si vous utilisez SqlDataReader ou un OleDbDataReader, les fermer. Même si la fermeture de la connexion en elle-même semble faire le tour, à mettre dans les efforts supplémentaires pour fermer votre lecteur de données des objets explicitement lorsque vous les utilisez.


Cet article "Pourquoi une Connexion de Piscine à Débordement?" à partir de MSDN/SQL Magazine explique beaucoup de détails, et suggère des stratégies de débogage:

  • Exécutez sp_who ou sp_who2. Ces procédures stockées du système de retour d'informations de l' sysprocesses système de tableau qui indique le statut et les informations sur tous les processus de travail. En règle générale, vous verrez un processus serveur ID (SPID) par connexion. Si vous avez nommé votre connexion en utilisant le Nom de l'Application argument dans la chaîne de connexion, votre travail connexions sera facile à trouver.
  • Utilisation de SQL Server Profiler avec le SQLProfiler TSQL_Replay modèle pour tracer les connexions ouvertes. Si vous êtes familier avec le Profiler, cette méthode est plus facile que l'interrogation par l'utilisation de sp_who.
  • Utilisez l'analyseur de Performances pour Surveiller les piscines et les connexions. Je discuter de cette méthode dans un instant.
  • Surveiller les compteurs de performance dans le code. Vous pouvez surveiller l'état de santé de votre pool de connexions et le nombre de connexions établies en utilisant des routines pour extraire les compteurs ou par l'aide de la nouvelle .NET PerformanceCounter contrôles.

13voto

Ivo Points 2211

Avez-vous vérifier DataReaders qui ne sont pas fermées et response.redirects avant de fermer la connexion ou un datareader. Les connexions restent ouvertes lorsque vous ne les fermer avant une redirection.

13voto

Marc Gravell Points 482669

Sauf si votre consommation a augmenté de beaucoup, il semble peu probable qu’il n’y a juste un arriéré de travail. L’OMI, l’option la plus probable est que quelque chose est à l’aide de connexions et ne pas les libérer rapidement. Êtes-vous sûr que vous utilisez `` dans tous les cas ? Ou (au moyen de quelque mécanisme) libérant les connexions ?

12voto

Alex Czarto Points 1283

Nous rencontrons ce problème de temps en temps sur notre site web aussi bien. Le coupable dans notre cas, est nos stats/index de mise à jour. Cela provoque un précédemment rapide requête en cours d’exécution (éventuellement) devenir lent et expirer.

Essayez de mettre à jour les statistiques et/ou reconstruire les index sur les tables affectées par la requête et voir si cela aide.

6voto

Mehrdad Afshari Points 204872

Vous pouvez spécifier la taille de pool minimale et maximale en spécifiant ou dans la chaîne de connexion. Cette cause du problème pourrait être quelque chose de différent toutefois.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X