web-dev-qa-db-fra.com

Exception de sémaphore - L'ajout du nombre spécifié au sémaphore le ferait dépasser son nombre maximal

Je reçois cette exception SemaphoreFullException depuis un moment.

Pour résumer .. J'ai hébergé une application sur IIS 7.5 avec un pool d'applications (Framework) ASP.NET v4.0 Framework (intégré) . J'utilise l'authentification Windows pour authentifier mes utilisateurs via le domaine (isinrole) .

J'ai déjà vu toutes les discussions sur ce sujet, où il est suggéré de définir Pooling = False . Je ne veux pas le faire et j'aimerais continuer à utiliser la mise en commun en raison des avantages en termes de performances.

J'utilise Entity Framework 6 pour interroger la base de données et je ne "supprime" pas le dbcontext dans le code utilisateur . Il semble que le problème se trouve dans le code DbConnectionPool.

L'erreur se produit de manière aléatoire à un moment donné. Peu importe si l'application est utilisée ou non. Parfois, à cause de ce problème, je dois redémarrer IIS car les nouveaux utilisateurs ne sont plus authentifiés.

Ce que j'ai essayé jusqu'à présent:

  • Vérifiez si un objet de transaction de base de données est en cours de suppression.
  • Vérifiez si un DBContext (ctx) est supprimé prématurément.
  • Vérifiez la construction de l'application (32/62 bits). Dans ce cas, je construis l'application en n'importe quel mode CPU et mon serveur est en 64 bits.

Remarque: Dans mon application, j'ai principalement utilisé des objets linq-to-EF pour interroger la base de données.

Exception: System.Threading.SemaphoreFullException

Message: Adding the specified count to the semaphore would cause it to exceed its maximum count.

StackTrace:    at System.Threading.Semaphore.Release(Int32 releaseCount)
   at System.Data.ProviderBase.DbConnectionPool.CleanupCallback(Object state)
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.TimerQueueTimer.CallCallback()
   at System.Threading.TimerQueueTimer.Fire()
   at System.Threading.TimerQueue.FireNextTimers()

Toute aide à cet égard sera grandement appréciée.

16
Ali Haider

Je pense que cela pourrait être une solution au problème: http://www.davepaquette.com/archive/2013/03/27/managing-entity-framework-dbcontext-lifetime-in-asp-net-mvc. aspx - comme vous pouvez le constater, il est essentiel de veiller à la mise au rebut du DbContext à la fin de sa vie.

N'oubliez pas que les connexions Db aboutissent dans un code de gestion de base non géré. Par conséquent, le problème est que si le garbage collection ne dispose pas du contexte, il reste en veille dans la mémoire principale, bloquant ainsi une connexion du pool de connexions. Donc, tôt ou tard, dans les bonnes conditions, vous videz le pool de connexions et obtenez votre exception.

4
flohack

Dans mon cas, le problème était que j'ai arrêté l'application pendant le débogage. L'application faisait beaucoup d'appels asynchrones. 

J'ai donc réinitialisé mon serveur IIS: iisreset via une invite de commande ou PowerShell, et cela a fonctionné.

9
Luis Teijon

J'ai eu le même problème et c'était parce que je faisais .Dispose(); avant de fermer la connexion, voici comment je l'ai résolu:

J'ai eu deux instances de .Dispose(); - une dans un SqlDataAdapter, l'autre dans un SqlCommand et après cela fermait la connexion et obtenait l'erreur . Il suffit de supprimer le .Dispose(); de mon SqlCommand et mon SqlDataAdapter, et plus d'erreur! J'espère que cela aide d'une certaine manière.

1
JCO9