管理EntityConnection生命周期

7

有关管理 EntityContext 生命周期的问题已经有很多了,

例如:在LINQ to Entities中实例化上下文

我得出结论:应将实体上下文视为工作单元,因此不应重复使用。太好了。

但是,在为加速数据库访问做一些研究时,我发现了这篇博客文章...

提高 Entity Framework 性能

该文章认为,与其他框架相比,EF 的性能差常常是因为每次需要新的 EntityContext 对象时都会创建 EntityConnection 对象。

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

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

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

据我所知,这似乎加快了一些速度,而且没有出现任何错误。

但是这样做安全吗?

使用应用程序范围内的静态 EntityConnection 是否会引起竞争条件?

祝好, Kervin


这可能会引发一场圣战。 ;) - Nix
2个回答

7

谢谢。我确信这不会那么容易,但我正在努力弄清楚是否有人在汇集连接以提高性能。因为那篇MSDN博客文章对此进行了充分的论述。 - kervin
我不会在.NET 4中重新测试之前更改任何内容。这个问题可能已经得到解决了。 - Craig Stuntz

2
  • 如果您的EF上下文是应用程序范围内的,请考虑用户A进行了更改(未提交)和用户B已提交他的更改,由于用户A和B使用同一实例,所有更改都将提交到数据库

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

实现这种方式的一种方法是使用DI容器(我使用Unity)来管理EF上下文的生命周期。 Unity默认情况下不提供每个Web请求生命周期管理器,但有很多文章介绍如何实现。

希望对你有所帮助。


1
嗨,谢谢,但我的EntityContext并不是应用程序范围内的。它使用的EntityConnection是。我将EntityContext用作“工作单元”,即每次访问都使用一个新的上下文。 - kervin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接