实体框架6上下文生命周期

时间:2015-01-30 04:14:27

标签: entity-framework

我一直在读到使用上下文的“正确”方式如下:

using (var Db = new MyDatabase())
{
    DoStuff(Db);
}

但我发现在某些情况下这种情况会非常缓慢 我有一个从不同的线程,通过Web请求被大量调用的函数,并且是只读的。

这是我的测试代码:

var S = new Stopwatch()
S.Start();
Parallel.For(
    0,
    15000,
    I =>
    {
        var P = GetPostWebContent(I);
    });

S.Stop();
Console.WriteLine(S.ElapsedMilliseconds);


使用“推荐”方法,15000个呼叫的执行时间为303.6秒,每个呼叫的执行时间为20.24毫秒。


现在,通过为每个线程保留一个上下文,我得到了非常不同的结果,使用以下代码:

[ThreadStatic]
private static MyDatabase _Db;
if (_Db == null) _Db = new DatabaseWebsite();
DoStuff(Db);

15000次呼叫的执行时间为52.4s,每次呼叫的执行时间为3.5ms。
这意味着此解决方案的速度提高了5.8倍!

我有点震惊:我一直在网上看到上下文创建并不是一件大事,等等;但就我而言,它产生了巨大的影响 我知道,通过这种实现,上下文的大小会不断增加,但我可以实现一个计数器并定期重新创建上下文。
有什么东西可以防止这种情况被使用吗?如上所述,所有操作都是READ ONLY,我没有在数据库中写任何内容。

1 个答案:

答案 0 :(得分:0)

这只是一个建议。上下文不是线程安全的,因此如果性能对您很重要,那么每个线程一个是个好主意。

我倾向于围绕在同一个线程上运行的方法传递上下文,因为我发现了创建上下文时的性能问题。它为我制作了生产代码。