我一直在安静这个SemaphoreFullException。
总结一下..我在IIS 7.5上托管了一个带有ASP.NET v4.0框架应用程序池(集成)的应用程序。我正在使用Windows身份验证通过域(isinrole)验证我的用户。
我已经看过这个主题的所有其他主题,建议设置Pooling = False。我不想那样做,因为性能优势,我想继续使用池。
我正在使用Entity Framework 6来查询数据库,我没有在用户代码中的任何地方“处理”dbcontext。看起来这个问题出现在DbConnectionPool代码中。
错误在任何给定时刻随机发生。无论是否使用该应用程序都无关紧要。有时,由于此问题 - 我必须重新启动IIS,因为新用户停止进行身份验证。
到目前为止我尝试过的:
注意:在我的应用程序中,我主要使用linq-to-EF对象来查询数据库。
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()
在这方面的任何帮助将不胜感激。
我认为这可能是问题的解决方案:http://www.davepaquette.com/archive/2013/03/27/managing-entity-framework-dbcontext-lifetime-in-asp-net-mvc.aspx - 正如你在那里看到的那样,在生命周期结束时必须小心处理DbContext。
请记住,Db连接最终会出现在非托管数据库处理代码中,因此问题是除非垃圾收集处理它在主内存中保持睡眠的上下文,从而也阻止了连接池的连接。所以迟早,在适当的条件下,您清空连接池并获得异常。
就我而言,问题是我在调试时停止了应用程序。该应用程序正在进行大量的异步调用。
所以我重置我的IIS服务器:iisreset
通过命令提示符或PowerShell,它工作。
编辑:查看IIS Express的@aaroncatlin评论
我有同样的问题,因为我在关闭连接之前做.Dispose();
这是我解决它的方式:
我有两个.Dispose();
实例 - 一个在SqlDataAdapter中,另一个在一个SqlCommand中,然后关闭连接并得到错误。刚从我的SqlCommand和我的SqlDataAdapter中删除了.Dispose();
,没有更多的错误!我希望这会有所帮助。