Ces derniers jours, nous voyons trop ce message d'erreur sur notre site Web:
"Le délai a expiré. Le délai s'est écoulé avant d'obtenir une connexion à partir du pool. Cela peut être dû au fait que toutes les connexions mises en pool étaient en cours d'utilisation et que la taille maximale du pool a été atteinte."
Nous n'avons rien changé dans notre code depuis un moment. J'ai révisé le code pour vérifier les connexions ouvertes qui ne se sont pas fermées, mais j'ai trouvé que tout allait bien.
Comment puis-je resoudre ceci?
Dois-je modifier ce pool?
Comment puis-je modifier le nombre maximal de connexions de ce pool?
Quelle est la valeur recommandée pour un site Web à fort trafic?
Mettre à jour:
Dois-je modifier quelque chose dans IIS?
Mettre à jour:
J'ai constaté que le nombre de connexions actives est compris entre 15 et 31, et j'ai constaté que le nombre maximal autorisé de connexions configurées dans SQL Server est supérieur à 3200 connexions, 31 de trop ou dois-je modifier quelque chose dans la configuration ASP.NET ?
la source
Réponses:
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 les connexions ouvertes, elles restent bloquées jusqu'à ce que le garbage collector .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
etClose
lève une exception:La bonne façon serait la suivante:
ou
Lorsque votre fonction renvoie une connexion à partir d'une méthode de classe, assurez-vous de la mettre en cache localement et d'appeler sa
Close
méthode. Vous fuierez une connexion en utilisant ce code par exemple:La connexion renvoyée depuis le premier appel à
getConnection()
n'est pas fermée. Au lieu de fermer votre connexion, cette ligne en crée une nouvelle et essaie de la fermer.Si vous utilisez
SqlDataReader
ou aOleDbDataReader
, fermez-les. Même si la fermeture de la connexion semble faire l'affaire, faites l'effort supplémentaire de fermer explicitement les objets de votre lecteur de données lorsque vous les utilisez.Cet article « Pourquoi un dépassement de pool de connexions? » De MSDN / SQL Magazine explique de nombreux détails et suggère quelques stratégies de débogage:
sp_who
ousp_who2
. Ces procédures stockées système renvoient des informations de lasysprocesses
table système qui indiquent 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.TSQL_Replay
modèle SQLProfiler pour tracer les connexions ouvertes. Si vous connaissez Profiler, cette méthode est plus simple que d'interroger en utilisant sp_who.la source
Lors de l'installation de .NET Framework v4.6.1, nos connexions à une base de données distante ont immédiatement commencé à expirer en raison de ce changement .
Pour corriger, ajoutez simplement le paramètre
TransparentNetworkIPResolution
dans la chaîne de connexion et définissez-le sur false :la source
À moins que votre utilisation n'augmente beaucoup, il semble peu probable qu'il y ait juste un retard de travail. OMI, l'option la plus probable est que quelque chose utilise des connexions et ne les libère pas rapidement. Êtes-vous sûr que vous utilisez
using
dans tous les cas? Ou (par n'importe quel mécanisme) libérer les connexions?la source
Avez-vous vérifié les DataReaders qui ne sont pas fermés et response.redirects avant de fermer la connexion ou un lecteur de données. Les connexions restent ouvertes lorsque vous ne les fermez pas avant une redirection.
la source
Nous rencontrons également ce problème de temps en temps sur notre site Web. Le coupable dans notre cas, ce sont nos statistiques / index obsolètes. Cela provoque une requête qui s'exécutait précédemment rapidement (éventuellement) devient lente et expire.
Essayez de mettre à jour les statistiques et / ou de reconstruire les index sur les tables affectées par la requête et voyez si cela aide.
la source
Vous pouvez spécifier la taille minimale et maximale du pool en spécifiant
MinPoolSize=xyz
et / ouMaxPoolSize=xyz
dans la chaîne de connexion. Cette cause du problème pourrait cependant être différente.la source
J'ai également rencontré ce problème lors de l'utilisation d'une couche de données tierce dans l'une de mes applications .NET. Le problème était que la couche ne fermait pas correctement les connexions.
Nous avons jeté la couche et en avons créé une nous-mêmes, qui ferme et supprime toujours les connexions. Depuis lors, nous n'avons plus d'erreur.
la source
Vous pouvez également essayer cela, pour résoudre le problème de délai d'attente:
Si vous n'avez pas ajouté httpRuntime à votre configuration Web, ajoutez-le dans la
<system.web>
baliseet
Modifiez votre chaîne de connexion comme ceci;
Dernière utilisation
la source
Cela est principalement dû au fait que la connexion n'a pas été fermée dans l'application. Utilisez "MinPoolSize" et "MaxPoolSize" dans la chaîne de connexion.
la source
Dans mon cas, je ne fermais pas l'objet DataReader.
la source
Si vous travaillez sur un code hérité complexe où une simple utilisation de (..) {..} n'est pas possible - comme je l'étais - vous pouvez consulter l'extrait de code que j'ai publié dans cette question SO pour trouver un moyen de déterminer le pile d'appels de la création de connexion lorsqu'une connexion est potentiellement divulguée (non fermée après un délai défini). Cela permet de détecter assez facilement la cause des fuites.
la source
N'instanciez pas trop la connexion SQL. Ouvrez une ou deux connexions et utilisez-les pour toutes les prochaines opérations SQL.
Semble que même lors
Dispose
des connexions, l'exception est levée.la source
En plus des solutions affichées ....
En traitant 1000 pages de code hérité, chacune appelant plusieurs fois un GetRS commun, voici une autre façon de résoudre le problème:
Dans une DLL commune existante, nous avons ajouté l' option CommandBehavior.CloseConnection :
Ensuite, dans chaque page, tant que vous fermez le lecteur de données, la connexion est également fermée automatiquement afin d'éviter les fuites de connexion.
la source
Je viens d'avoir le même problème et je voulais partager ce qui m'a aidé à trouver la source: ajouter le nom de l'application à votre chaîne de connexion, puis motiver la connexion ouverte à SQL Server
la source
Ce problème que j'avais dans mon code. Je vais coller un exemple de code que j'ai dépassé en dessous de l'erreur. Le délai d'expiration s'est écoulé avant l'obtention d'une connexion à partir du pool. Cela peut se produire car toutes les connexions regroupées étaient en cours d'utilisation et la taille maximale du pool a été atteinte.
Vous souhaitez fermer la connexion à chaque fois. Avant cela, je ne nous ai pas connecté à cause de cela, j'ai eu une erreur. Après avoir ajouté une déclaration de fermeture, j'ai surmonté cette erreur
la source
Vous avez divulgué des connexions sur votre code. Vous pouvez essayer d'utiliser using pour certifier que vous les fermez.
https://blogs.msdn.microsoft.com/angelsb/2004/08/25/connection-pool-and-the-timeout-expired-exception-faq/
la source
Ce problème que j'ai rencontré auparavant. Cela a fini par être un problème avec le pare-feu. Je viens d'ajouter une règle au pare-feu. J'ai dû ouvrir le port
1433
pour que le serveur SQL puisse se connecter au serveur.la source
Utilisez ceci:
la source
SqlConnection.ClearPool
, mais est-ce que cela empêche simplement que votre connexion actuelle soit rétablie dans le pool de connexions? Je pensais que l'idée du pool de connexions était de permettre des connexions plus rapides. Libérer la connexion du pool à chaque fois qu'elle est terminée signifie qu'une nouvelle connexion devra être créée CHAQUE FOIS qu'une connexion est nécessaire, au lieu d'en extraire une de rechange dans le pool? Veuillez expliquer comment et pourquoi cette technique est utile.Oui, il existe un moyen de modifier la configuration. Si vous êtes sur un serveur dédié et que vous avez simplement besoin de plus de connexions SQL, vous pouvez mettre à jour les entrées "taille maximale du pool" dans les deux chaînes de connexion en suivant ces instructions:
Trouvez vos chaînes de connexion, elles ressembleront aux exemples ci-dessous:
"add name =" SiteSqlServer "connectionString =" server = (local); database = dbname; uid = dbuser; pwd = dbpassword; pooling = true; durée de vie de la connexion = 120; taille maximale du pool = 25; ""
5.Changez la valeur max pool size = X à la taille de pool requise.
la source
Assurez-vous d'avoir configuré les paramètres corrects pour le pool de connexions. C'est très important, comme je l'ai expliqué dans l'article suivant: https://medium.com/@dewanwaqas/configurations-that-significantly-improves-your-app-performance-built-using-sql-server-and-net- ed044e53b60 Vous verrez une amélioration drastique des performances de votre application si vous la suivez.
la source
Dans mon cas, j'avais une boucle infinie (à partir d'une propriété get essayant d'obtenir la valeur de la base de données) qui continuait d'ouvrir des centaines de connexions SQL.
Pour reproduire le problème, essayez ceci:
la source