【发布时间】:2015-05-03 11:15:16
【问题描述】:
我已经有这个 SemaphoreFullException 安静了一段时间了。
总结.. 我在 IIS 7.5 上使用 ASP.NET v4.0 框架应用程序池(集成)托管了一个应用程序。 我正在使用 Windows 身份验证通过域 (isinrole) 对我的用户进行身份验证。
我已经看到有关此主题的所有其他主题,建议将 Pooling = False 设置为。 我不想这样做,我想继续使用池化,因为它可以带来性能优势。
我正在使用 Entity Framework 6 来查询数据库,并且我没有在用户代码中的任何地方“处理”dbcontext。 看起来问题出在 DbConnectionPool 代码中。
错误在任何给定时刻随机发生。应用程序是否正在使用并不重要。有时,由于这个问题 - 我必须重新启动 IIS,因为新用户停止通过身份验证。
到目前为止我已经尝试过:
- 检查是否正在释放 DB 事务对象。
- 检查 DBContext (ctx) 是否被过早释放。
- 检查应用程序构建(32/62 位)。在这种情况下 - 我在任何 CPU 模式下构建应用程序,并且我的服务器是 64 位的。
注意:在我的应用程序中,我主要使用 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()
在这方面的任何帮助将不胜感激。
【问题讨论】:
-
我们也看到了这种情况 - 您找到解决方案了吗?除了一个含糊的(而且不是 100% 有效)建议关闭连接池之外,Google 搜索没有任何进展,这对我们来说无法扩展。
-
我没有解决方案,只是一些观察。 DBContext 不打算像这样使用。 DBContext 不是线程安全的。如何管理 DBContent 的线程方面?注意 IIS 调用可能涉及不同的线程。我怎么强调都不过分,考虑转移到短暂的环境中。每个线程至少 1 个。
-
抱歉回复晚了。我们不得不转向 ADO/批量插入/更新选项以加快查询速度并消除此错误。
标签: c# asp.net-mvc entity-framework linq-to-entities iis-7.5