2017-03-18 217 views
3

我最近接觸到實體框架6 caching mechanism。 正如我們可能從this article得出的那樣,它是以第一槓的方式做的。我們是否需要外部緩存機制,而EF 6是否使用緩存?

我們的系統使用與MemoryCache沿EF 6(第一代碼)來提高性能。

我們使用MemoryCache主要的原因是因爲我們需要在每一個頁面請求的執行強烈的查詢。我們對每個頁面請求執行此查詢x3次(在最壞的情況下),因爲有客戶端回調。

我不知道,如果我們仍然需要使用MemoryCache機制如果EF 6已經在使用一個。

值得一說的是,我們不使用任何特殊的緩存功能或緩存依賴。只是一個簡單的MemoryCache超時。

回答

3

英孚在上下文中緩存的實體的事實是沒有辦法「真正的」緩存,由於種種原因更換:

  1. 你不應該重複使用一個以上的邏輯運算EF背景下,因爲EF上下文表示工作單元,因此應根據此模式使用。而且,即使由於某種原因在多個操作中重用上下文 - 您絕對不能在多線程環境中執行此操作,例如Web服務器應用程序。

  2. 它不會阻止你做多個查詢相同數據到數據庫,例如:

    var entity1 = ctx.Entities.Where(c => c.Id == 1).First(); 
    var entity2 = ctx.Entities.Where(c => c.Id == 1).First(); 
    

    這仍將執行兩個查詢到您的數據庫,儘管查詢是相同的並返回相同的實體。所以在這裏通常意義上沒有什麼是「緩存」的。但請注意,即使兩個查詢之間的數據庫行已更改,兩個查詢都將返回相同的實體。這就是EF上下文「緩存」的含義。它會執行兩次數據庫查詢,但是第二次在評估結果時會注意到已經存在具有與上下文相同的鍵的實體。因此,它將返回此現有(「緩存」)實體,並將忽略第二個查詢返回的新值(如果有的話)。這種行爲是不能在多個操作之間重用上下文的另一個原因(儘管您不應該這樣做)。

所以,如果你想降低您的數據庫負載 - 你使用任何適合您的需求(從簡單到InMemoryCache緩存EF提供分佈式memcached的實例)使用二級緩存。

+0

謝謝你。我對第二部分感到驚訝,如果我執行一個查詢,然後更改數據庫中的值並再次執行相同的查詢,它會帶給我相同的結果,而不會發生更改。它是否仍然在第二次提到DB?雖然它給了我未更新的數據? – Jacob

+0

@Jacob我更新了那部分來回答你的問題,希望它很清楚。如果您仍然有這方面的擔憂 - 很容易驗證自己 - 只需設置日誌記錄(如'context.Database.Log = Console.WriteLine'),然後執行相同的查詢兩次,您將看到執行了兩個數據庫查詢。 – Evk

+0

最好解釋。非常感謝你! – Jacob

4

EF只實現了所謂的實體一級高速緩存,它保存了已經在上下文的續航時間已經檢索到的實體,所以當你問該實體,第二次返回從上下文中的實體。您需要的是二級緩存,但EF不能植入此功能。例如,NCache實現了一個美妙的緩存體系結構,併爲EF提供了一個二級緩存提供程序。不在其開源版本中。