簡體   English   中英

實體框架6上下文生存期

[英]Entity Framework 6 Context Lifetime

我到處都讀到使用上下文的“正確”方法如下:

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.6s,每個呼叫20.24ms。


現在,通過每個線程保留一個上下文,我可以使用以下代碼獲得截然不同的結果:

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

15000個呼叫的執行時間為52.4s,每個呼叫3.5ms。
這意味着該解決方案的速度提高了5.8倍!

我有點震驚:我一直在網上閱讀上下文創建不是什么大問題,等等。 但就我而言,它具有巨大的影響。
我知道通過此實現,上下文將繼續增長,但是我可以實現一個計數器並定期重新創建上下文。
有什么可以防止這種情況被使用的嗎? 就像我上面說的,所有操作都是只讀的,我沒有向數據庫寫任何東西。

這只是一個建議。 上下文不是線程安全的,因此如果性能對您很重要,則每個線程一個線程是一個好主意。

我傾向於將上下文傳遞給在同一線程上運行的方法,因為在創建上下文時發現了性能問題。 它已經為我制作了生產代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM