it-swarm.com.de

Semaphor-Ausnahme - Durch Hinzufügen des angegebenen Zählwerts zum Semaphor wird der Höchstwert überschritten

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:

  • Prüfen Sie, ob ein DB-Transaktionsobjekt verworfen wird.
  • Prüfen Sie, ob ein DBContext (ctx) vorzeitig entsorgt wird.
  • Überprüfen Sie den Anwendungsaufbau (32/62 Bit). In diesem Fall erzeuge ich die Anwendung in einem beliebigen CPU-Modus und mein Server ist 64-Bit.

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.

16
Ali Haider

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.

4
flohack

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.

9
Luis Teijon

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.

1
JCO9