5

我的 mvc+ef+unity 应用程序在较高负载(每秒 10+ 个请求)下遇到随机错误(每天几次):

  • 连接未关闭/连接的当前状态为正在连接
  • Count 查询死锁(无显式事务)
  • 已添加具有相同密钥的项目。在 System.Data.Entity.DbContext.SetTEntity中解析 DbContext
  • 远程主机关闭了连接。错误代码为 0x80070057
  • 已经有一个与此命令关联的打开的 DataReader,必须先关闭它。- 我打开 MARS 来摆脱这个问题(虽然我相信它应该在没有 MARS 的情况下正常工作,没有嵌套查询),这可能会导致另一个随机错误:
  • 服务器将断开连接,因为客户端驱动程序在会话处于单用户模式时发送了多个请求。

我使用PerRequestLifetimeManager 的这个实现并尝试了 Unity.Mvc3 也没有任何区别。

一些 提示表明 DbContext 未正确处理。我不确定每个请求是否是问题的原因,因为这似乎是常见的做法。

4

1 回答 1

3

经过进一步调查,我发现请求处理线程有时会从其他线程中窃取 DbContext,因此 Rashid 的 PerRequestLifetimeManager 实现可能不是线程安全的。我再次搬到 Unity.Mvc3 并且错误消失了,我上次尝试时一定犯了一些错误。

唯一不相关的错误是死锁。它们是由碰撞引起的

SELECT ... FROM X JOIN Y ... JOIN Z ...

BEGIN TRAN
UPDATE Z ...
UPDATE Y ...
COMMIT TRAN

SELECT 锁定 Y 并想要 Z,TRAN 锁定 Z 并想要 Y

于 2013-02-28T14:26:36.897 回答