Ich habe diese SemaphoreFullException seit einiger Zeit ruhig.
Zusammenfassend .. Ich habe eine Anwendung auf IIS 7.5 mit ASP.NET v4.0 Framework Application Pool (integriert) gehostet .
Ich habe alle anderen Threads zu diesem Thema gesehen, in denen vorgeschlagen wird, Pooling = False ..__ festzulegen. Ich möchte das nicht tun, und ich möchte das Pooling aufgrund der Leistungsvorteile weiterhin verwenden.
Ich verwende Entity Framework 6, um die Datenbank abzufragen, und "disponiert" den dbcontext-Code nicht an beliebiger Stelle im Benutzercode. Es sieht so aus, als ob das Problem im DbConnectionPool-Code liegt.
Der Fehler tritt zufällig zu einem bestimmten Zeitpunkt auf. Es spielt keine Rolle, ob die Anwendung verwendet wird oder nicht. Aufgrund dieses Problems muss ich manchmal IIS neu starten, da neue Benutzer keine Authentifizierung mehr erhalten.
Was ich bisher ausprobiert habe:
Hinweis: In meiner Anwendung habe ich meistens linq-to-EF-Objekte zum Abfragen der Datenbank verwendet.
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()
Jede diesbezügliche Hilfe wird sehr geschätzt.
Ich denke, dass dies eine Lösung für das Problem sein kann: http://www.davepaquette.com/archive/2013/03/27/managing-entity-framework-dbcontext-lifetime-in-asp-net-mvc. aspx - wie Sie dort sehen können, ist es wichtig, die Entsorgung von DbContext nach dessen Lebenszeit zu beachten.
Denken Sie daran, dass Db-Verbindungen in nicht verwaltetem Db-Verarbeitungscode enden. Das Problem besteht also, wenn die Garbage Collection nicht den Kontext bereitstellt, der im Hauptspeicher verbleibt, wodurch auch eine Verbindung aus dem Verbindungspool blockiert wird. Früher oder später leeren Sie den Verbindungspool unter den richtigen Bedingungen und erhalten Ihre Ausnahme.
In meinem Fall bestand das Problem darin, dass die Anwendung während des Debugging gestoppt wurde. Die Anwendung machte viele asynchrone Aufrufe.
Also habe ich meinen IIS -Server zurückgesetzt: iisreset
über die Eingabeaufforderung oder PowerShell, und es hat funktioniert.
Ich hatte das gleiche Problem und habe es gelöst, weil ich .Dispose();
vor dem Schließen der Verbindung ausgeführt habe:
Ich hatte zwei Instanzen von .Dispose();
- eine in einem SqlDataAdapter, die andere in einem SqlCommand und danach wurde die Verbindung geschlossen und der Fehler angezeigt. Habe gerade die .Dispose();
aus meinem SqlCommand und meinem SqlDataAdapter entfernt und keinen Fehler mehr! Ich hoffe das hilft irgendwie.