2016-03-03 1 views
1

Au cours des deux derniers jours, j'ai essayé de résoudre l'erreur suivante:fuite de connexion dans Entity Framework

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.

Pour autant que je l'ai vérifié tous nos DbContext demandes sont enveloppés avec using, et encore On dirait qu'il n'est pas disposé ou quelque chose d'autre.

Existe-t-il un moyen de déterminer si l'application Web présente une fuite de connexion? Ir autre chose que je peux essayer ?!

J'ai essayé d'augmenter les délais d'attente dans SQL Server + incrémenter la taille du pool de la valeur par défaut de 100 à 200 comme un résultat temporaire, mais cela n'a pas aidé, et ce n'est pas les solutions que je veux.

Toute suggestion aiderait.

+0

vous utilisez les transactions? –

+0

Avez-vous disposé du contexte correctement? –

+0

Danny le dbcontext est enveloppé avec l'utilisation, est-il autre chose que je devrais faire ?! –

Répondre

0

Je pense avoir un cas similaire au vôtre. Notre ancienne version de projet (utilisant toujours EF4) perd des connexions lorsque mon code ne touche PAS le contexte. Le contexte est créé, une nouvelle connexion est allouée, mais sur Dispose() le contexte ne semble pas renvoyer sa connexion.

Si je viens d'effectuer une petite requête (.First() sur n'importe quelle table aléatoire) dans ce contexte sous-utilisé, la situation s'améliore.

Une branche plus récente de mon projet utilise EF6. Ce code fonctionne bien.

Ce qui m'a aidé à dépister cela était SQL Profiler. Je savais aussi à peu près ce que mon utilisateur faisait, alors j'ai répété ses pas et gardé un œil sur la colonne SPID de Profiler. Puis j'ai traversé des parties du code jusqu'à ce que j'obtienne l'une des connexions fantômes que je poursuivais.

(je suis tombé sur tout à l'heure, donc je n'ai pas eu le temps d'étudier plus avant)