【问题标题】:Managing EntityConnection lifetime管理 EntityConnection 生命周期
【发布时间】:2010-04-04 18:41:27
【问题描述】:

关于管理EntityContext生命周期有很多问题,

例如Instantiating a context in LINQ to Entities

我得出的结论是,实体上下文应被视为工作单元,因此不应重用。太好了。

但是在做一些研究以加快我的数据库访问速度时,我遇到了这篇博文......

Improving Entity Framework Performance

该帖子认为,与其他框架相比,EF 的性能不佳通常是由于每次需要新的 EntityContext 对象时都会创建 EntityConnection 对象。

为了测试这一点,我在 Global.asax.cs Application_Start() 中手动创建了一个静态 EntityConnection。

然后我将所有上下文 using 语句转换为

using( MyObjContext currContext = new MyObjeContext(globalStaticEFConnection)
{
   ....
}

据我所知,这似乎加快了速度,没有任何错误。

但是这样安全吗?

使用应用程序范围的静态 EntityConnection 会引入竞争条件吗?

最好的问候, 凯文

【问题讨论】:

  • 这可能会引发一场圣战。 ;)

标签: c# .net asp.net entity-framework entityconnection


【解决方案1】:

EntityConnection is documented to be not thread-safe。我认为您可以将它们池化,但您不能对 Web 应用程序使用单个静态连接,因为这将涉及很多线程。

【讨论】:

  • 谢谢。我确信这不会那么容易,但我非常想弄清楚是否有人在汇集连接以提高性能。因为那篇 MSDN 博客文章为此提供了充分的理由。
  • 如果不在 .NET 4 中重新测试,我不会更改任何内容。这可能已经得到解决。
【解决方案2】:
  • 如果您的 EF 上下文是应用程序范围的,请考虑用户 A 已进行更改(未提交)并且用户 B 已提交他的更改,所有更改都将提交到数据库,因为用户 A 和 B 都使用同一个实例

  • 在我的项目中,我对 EF 上下文进行了每个 WebRequest 实例 - 即。上下文对象从 Web 请求的开始到结束都是静态的,并且该请求中的所有操作都使用相同的 EF 上下文。在没有上述问题的情况下,这大大加快了我的处理速度。

实现这一点的一种方法是使用 DI 容器(我正在使用 Unity)来管理 EF 上下文的生命周期。在 Unity 中,每个 Web 请求生命周期管理器并不是开箱即用的,但是有大量文章展示了如何做到这一点。

HTH。

【讨论】:

  • 您好,谢谢,但我的 EntityContext 不是应用程序范围的。它使用的 EntityConnection 是。我使用 EntityContext 作为“工作单元”,即。基本上每次访问都有一个新的上下文。