Cet article est un article miroir de traduction automatique, veuillez cliquer ici pour accéder à l’article original.

Vue: 24272|Répondre: 0

[Source] Foit EF Core : DbContextPool cause une épuisement de connexion au pool de base de données

[Copié le lien]
Publié le 18-11-2019 à 14:41:59 | | |
DbContextPool est une nouvelle fonctionnalité introduite dans ASP.NET Core 2.1 qui évite la surcharge de création d’une instance DbContext, mais il y a un petit gouffre caché dedans.
Récemment, un projet ASP.NET Core a fonctionné en continu pendant une période, puis une erreur est apparue dans les journaux indiquant que le pool de connexions à la base de données avait atteint le nombre maximal de connexions :


System.InvalidOperationException: Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached.
   at System.Data.Common.ADP.ExceptionWithStackTrace(Exception e)
Au début, je pensais que c’était un code qui faisait que le DbContext se débarrasse correctement, mais je n’ai trouvé aucun indice dans le code. Plus tard, il n’y avait vraiment plus rien à douter, seulement DbContextPool, alors j’ai essayé de supprimer DbContextPool, mais l’erreur a disparu. Cela a effectivement été causé par DbContextPool, mais ce qui fait se poser des questions, c’est que DbContextPool a été à l’origine conçu pour éviter la surcharge de création d’instances DbContext, alors comment peut-il consommer plus de connexions à la base de données, alors que la charge de ce projet est très faible, comment peut-il consommer tout le pool de connexions ?
J’ai parlé de ce problème étrange lors de la réunion hebdomadaire aujourd’hui, puis j’ai soudain pensé que chaque instance DbContext occuperait une connexion à la base de données (SqlConnection), et que lorsque DbContextPool n’est pas activé, dès que la requête se termine, l’instance DbContext correspondante sera éliminée et la connexion à la base de données sera remise dans le pool de connexions. Lors de l’utilisation de DbContextPool, le DbContext ne sera pas éliminé mais replacé dans le DbContextPool après la fin de la requête, et le DbContext sera replacé dans son propre pool, ce qui signifie que sa connexion correspondante à la base de données ne sera pas retournée au pool de connexion auquel il appartient. Chaque DbContext dans le DbContextPool correspond à une connexion à une base de données, et pour chaque DbContext supplémentaire dans le DbContextPool, il y aura une connexion de base de données en moins dans le pool de connexions de base de données. Lorsque les deux pools ont des tailles différentes et que le DbContextPool est plus grand que le pool de connexion de la base de données, le problème survient : DbContextPool remplit librement le DbContext dans le pool selon la taille de son propre pool (dis-le 128), en ignorant la taille du pool de connexion à la base de données (en supposant qu’il soit 100), et l’erreur ci-dessus se produira lorsque le 101e DbContext est rempli.
Ce projet utilise les paramètres par défaut, est-ce que ce paramètre par défaut déclenche ce problème ?

En regardant le code source d’implémentation de DbContextPool, la limite de taille par défaut pour le pool de découverte est de 128


En regardant le code source d’implémentation de SqlConnention, vous constaterez que la limite de taille par défaut pour les pools de connexion est de 100

Le réglage par défaut déclenchera le problème, ce qui est en réalité un petit écueil.

Connaissant la raison, la solution est simple : régler la taille du pool du DbContextPool à inférieure à la Max_Pool_Size du pool de connexion à la base de données





Score

Nombre de participants1MO+1 contribuer+1 Effondrement raison
Zmoli775 + 1 + 1 Marche sur la fosse et marche dessus +1

Voir toutes les notes





Précédent:C# hérite de la détermination de IsAssignableFrom, IsSousclasseDe
Prochain:Solution de contournement des exceptions de base du MySQL Entity Framework
Démenti:
Tous les logiciels, supports de programmation ou articles publiés par Code Farmer Network sont uniquement destinés à l’apprentissage et à la recherche ; Le contenu ci-dessus ne doit pas être utilisé à des fins commerciales ou illégales, sinon les utilisateurs assumeront toutes les conséquences. Les informations sur ce site proviennent d’Internet, et les litiges de droits d’auteur n’ont rien à voir avec ce site. Vous devez supprimer complètement le contenu ci-dessus de votre ordinateur dans les 24 heures suivant le téléchargement. Si vous aimez le programme, merci de soutenir un logiciel authentique, d’acheter l’immatriculation et d’obtenir de meilleurs services authentiques. En cas d’infraction, veuillez nous contacter par e-mail.

Mail To:help@itsvse.com