我將我的linq封裝到在我的重載控制器的構造函數中實例化的存儲庫類中的sql調用。我的存儲庫類的構造函數創建數據上下文,以便在頁面加載的整個過程中只使用一個數據上下文。即使我明確處理DataContext,爲什麼我的連接沒有關閉?
在我的存儲庫類的析構函數中,我顯式調用了DataContext的處理,儘管我不認爲這是必要的。
使用性能監視器時,如果我看我的用戶連接數並重復加載頁面,則每頁加載次數會增加一次。連接不會關閉或重用(約20分鐘)。
我試着把Pooling = false放在我的配置中,看看這是否有效果,但沒有。在任何情況下,我都不希望每個負載都有一個新的連接,我希望它能夠重用連接。
我試着在析構函數中放置一個斷點,以確保處置正在被擊中,並且確實已經足夠了。那麼發生了什麼?
一些代碼來說明我上面說:
控制器:
public class MyController : Controller
{
protected MyRepository rep;
public MyController()
{
rep = new MyRepository();
}
}
存儲庫:
public class MyRepository
{
protected MyDataContext dc;
public MyRepository()
{
dc = getDC();
}
~MyRepository()
{
if (dc != null)
{
//if (dc.Connection.State != System.Data.ConnectionState.Closed)
//{
// dc.Connection.Close();
//}
dc.Dispose();
}
}
// etc
}
注:我添加了一些提示和上下文信息的DC用於審計目的。這基本上就是爲什麼我想每個頁面加載一個連接
更新: 已經實現了IDisposable在我的倉庫,並在我的控制器類我無法找到一個方法來專門調用Dispose方法我的控制器作爲後上控制器由MvcHandler在幕後創建和銷燬。不過,我確實發現我的聯繫無論如何都被關閉了。我不舒服知道這是工作,但不知道爲什麼,所以我做了一些挖掘,發現了一個MSDN的報價,讓我開心:
當執行完成後,將MvcHandler如果控制器實現IDisposable檢查界面,如果是的話,將調用控制器上的Dispose來清理非託管資源。
最後更新: 一個月左右的時間與工作這個現在我已經刪除了所有這些代碼,並走了下來MS勸我在公共倉庫方法纏繞在代碼中的「使用」聲明的路線後並將這個DC傳遞給私有方法。這看起來有點浪費和重複,並導致更多的連接被打開和關閉。但我得到的LINQ到SQL緩存,我只能通過重置DC來解決。
啊,謝謝。我只是想知道我的代碼是否需要添加(指編輯) – 2010-04-21 20:22:18
我不太確定最後一點。 MVC生成我的控制器,那麼我該如何確保它被正確處理? – 2010-04-21 20:26:56
@Chris,繼承時要小心,我注意到你使這些字段受到保護。我不會有。 – 2010-04-21 20:31:02