c# - Excepción de semáforo: agregar el recuento especificado al semáforo haría que supere su recuento máximo
asp.net-mvc entity-framework (3)
He estado teniendo esta SemaphoreFullException desde hace algún tiempo.
Para resumir ... He alojado una aplicación en IIS 7.5 con ASP.NET v4.0 framework Application Pool (integrado). Estoy usando la autenticación de Windows para autenticar a mis usuarios a través del dominio (isinrole).
He visto todos los otros subprocesos sobre este tema, donde se sugiere establecer Pooling = False. No quiero hacer eso y me gustaría seguir usando la agrupación debido a los beneficios de rendimiento.
Estoy utilizando Entity Framework 6 para consultar la base de datos y no estoy "desechando" el dbcontext en ningún lugar del código de usuario. Parece que el problema está en el código DbConnectionPool.
El error se produce aleatoriamente en un momento dado del tiempo. No importa si la aplicación está siendo utilizada o no. A veces, debido a este problema, tengo que reiniciar IIS porque los usuarios nuevos dejan de autenticarse.
Lo que he probado hasta ahora:
- Compruebe si un objeto de transacción DB se está eliminando.
- Compruebe si un DBContext (ctx) se está eliminando prematuramente.
- Compruebe la compilación de la aplicación (32/62 bit). En este caso, compilo la aplicación en CUALQUIER modo de CPU y mi servidor es de 64 bits.
Nota: En mi aplicación, he usado principalmente objetos de linq-to-EF para consultar la base de datos.
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()
Cualquier ayuda en este sentido será muy apreciada.
Creo que esto puede ser una solución al problema: http://www.davepaquette.com/archive/2013/03/27/managing-entity-framework-dbcontext-lifetime-in-asp-net-mvc.aspx - Como puede ver, es esencial tener cuidado con la eliminación de DbContext cuando finaliza su vida útil.
Recuerde, las conexiones Db terminan en un código de gestión de db no administrado, por lo que el problema es que a menos que la recolección de basura disponga del contexto que permanece inactivo en la memoria principal, bloqueando así también una conexión desde el conjunto de conexiones. Por lo tanto, tarde o temprano, en las condiciones adecuadas, vaciará el grupo de conexiones y obtendrá su excepción.
En mi caso, el problema fue que detuve la aplicación durante la depuración. La aplicación estaba haciendo un montón de llamamientos asíncronos.
Así que reinicié mi servidor IIS: iisreset
través de Símbolo del sistema o PowerShell, y funcionó.
EDITAR : Mira el comentario de @aaroncatlin para IIS Express
Tuve el mismo problema y fue porque estaba haciendo .Dispose();
Antes de cerrar la conexión, así es como lo resolví:
Tuve dos instancias de .Dispose();
- uno en un SqlDataAdapter, el otro en un SqlCommand y después de eso fue cerrar la conexión y obtener el error. Acaba de quitar el .Dispose();
de mi SqlCommand y mi SqlDataAdapter, y no más errores! Espero que esto ayude de alguna manera.