2013-04-29 90 views
0

我只是繼承了具有以下成員基類的ASP.NET應用程序MVC4:保護基類的靜態

protected static DBMainDataContext m_dataContext = new DBMainDataContext(); 

這個基類是其他兩個類,無論使用LINQ來讀取數據繼承來自數據庫。這個基類有一個靜態數據上下文的事實,這是否構成一個問題?由於DataReader已打開,因此我們似乎正在獲取DataReader無法訪問的錯誤。這可能是爲什麼?如果是的話,應該如何申報?我只是刪除靜態關鍵字?

謝謝!

+0

作爲一般規則,重用'DBContext'或'ObjectContext'的實例似乎是一個壞主意。我認爲最好的方法是創建一個'Func ',它在每次需要時返回一個新的實例。 – 2013-04-29 19:19:50

+0

@HighCore技術上不需要改變static關鍵字,因爲包含它的控制器由MVC爲每個請求實例化。 – 2013-04-29 19:23:12

+0

當您完成從數據庫中讀取數據時,是否正確關閉了數據讀取器? – ryrich 2013-04-29 19:23:35

回答

0

是的,刪除static關鍵字是要走的路。

如果這是一個LINQ to SQL或實體框架上下文,那麼對象構建成本應該很低,因此您應該爲每個請求使用一個新實例。

您應該也許應該驗證您的DataReader是否正確關閉(如ryrich建議)。確保這一點的最好辦法是來包裝他們的使用在使用塊:

using(var reader = ...) 
{ 
    // code to use the reader here 
} 
+0

這是一個LINQ to SQL上下文,正如我所提到的,在代碼中沒有對DataReader的顯式操作,所以我認爲LINQ在幕後使用了一個。我會嘗試刪除靜態關鍵字,看看我們是否還有這些錯誤。 – Ray 2013-04-29 19:44:02

0

這是一個一般的規則是靜態的成員應該是線程安全的。所以,你的靜態m_dataContext應該是線程安全的。

DBMainDataContext不是線程安全的。因此,如果兩個線程(兩個ASP.NET請求)訪問數據上下文,則它由兩個線程同時修改。這將導致衝突。

所以,你有兩個選擇:

  1. 取出static,並且每個線程一個數據上下文。
  2. 通過將使用它的所有調用置於鎖定周圍來同步對數據上下文的訪問。
+1

並且請注意,考慮到這是一個網絡應用程序,選項2對於這個問題是一個相當沒有意思的解決方案。 – 2013-04-29 19:27:58