2013-11-22 40 views
1

我的MVC4應用程序使用代碼優先的實體框架5.0。我想從計時器線程訪問我的SQL Server數據。是否有任何理由不能實例化,使用和配置我在主ASP.NET工作線程上使用的相同派生DbContext類的實例? (是的,我使用相同的using()模式在主線程上實例化,使用和處理對象。)在後臺線程上使用DbContext

一個小問題上下文:我的網站在數據庫的表中有一個WebsiteEnabled字段。目前,我會爲每個GET請求執行數據庫提取以讀取該值。我想更改代碼以在後臺線程上每15秒讀取一次值,並將該值存儲在GET請求可以讀取的靜態變量中。我知道如果你嘗試在同一個線程上實例化同一個DbContext的多個實例,你會遇到問題;我不確定相同的限制是否適用於不同線程上相同DbContext的實例。

+1

我們還使用後臺線程來檢查電子郵件並每隔一段時間進行一次清理。只要你在後臺線程上創建一個新的上下文(並將其處理掉),而不是嘗試使用你的主應用程序線程中的那個上下文,那麼你會沒事的。 DbContext不是線程安全的,這意味着你不能在多個線程中共享它。這並不意味着你不能擁有多個線程,每個線程都有自己的數據庫上下文副本。謹慎小心謹防併發問題(試圖同時更新一行)。 – Tommy

+0

@Tommy:謝謝。請將此作爲答案而不是評論,以便我可以接受爲答案。 –

+0

沒問題鮑勃,張貼爲答案。就像我說的,只要你將DbContext本地化爲一個線程,你就不會有任何問題。 – Tommy

回答

1

我們還使用後臺線程來檢查電子郵件,並在我們較大的MVC應用程序中經常進行清理。只要你在後臺線程上創建一個新的上下文(並將其處理掉),而不是嘗試使用你的主應用程序線程中的那個上下文,那麼你會沒事的。 DbContext不是線程安全的,這意味着您無法安全地跨多個線程共享它。這並不意味着你不能擁有多個線程,每個線程都有自己的數據庫上下文副本。唯一的注意事項是注意併發問題(試圖同時更新一行)。

1

靜力和EF是混亂的食譜。在asp.net下,有1個應用程序池,有很多線程。存儲靜態如果你必須但不是上下文。所以一定要確保每個線程都有自己的上下文。

但是考慮到你的問題,有一個簡單的開箱即用的解決方案我會用 在thr控制器中應該有緩存值。在GET方法 您可以緩存每個ID,在一段特定的時間... 值得檢查。讓IIS,ASP.NET爲你工作。 :-)

[OutputCache(Duration = int.MaxValue, VaryByParam = "id", Location = OutputCacheLocation.ServerAndClient)] 
    public ActionResult Get(string id) { 
     // the value that can be cached is collected with a NEW CONTEXT ! 
+0

我不明白這個答案。我不想緩存頁面輸出;我想要緩存數據庫讀取操作。你可以請張貼更完整的例子嗎? –

+0

dbcontext不是線程安全的。 App池使用多個線程。本示例使用IIS緩存ID xyz的get info結果。這會緩存您閱讀的結果。緩存獲取是一個非常普遍的要求。重用現有功能是我的建議。研究OutputCache屬性。 –