我有幾個回收/表,被稱爲很多返回在我的網站成千上萬的行。我計劃幫助網站的性能,我應該開始緩存基礎數據,然後濾除個別頁面的數據。問題是,只要我實現了緩存,當使用/調用緩存對象時,我的NHibernate會話就會關閉。在本地主機緩存關閉我的NHibernate會話
我正在使用MVC 4,Ninject和存儲庫模式。
我在我的頁面上創建了一個屬性來處理訪問緩存對象,只是爲了驗證概念。我會重構到它自己的類後...
總之,這裏的代碼:
private IQueryable<TournamentType> _tournamentTypes;
private IEnumerable<TournamentType> TournamentTypes
{
get
{
_tournamentTypes = HttpRuntime.Cache.Get("TournamentTypes") as IQueryable<TournamentType>;
if (_tournamentTypes == null)
{
//if (System.Web.HttpContext.Current.Application["TournamentTypes"] == null)
// System.Web.HttpContext.Current.Application["TournamentTypes"] = _tournamentTypeRepo.Query();
//_tournamentTypes = System.Web.HttpContext.Current.Application["TournamentTypes"] as IQueryable<TournamentType>;
_tournamentTypes = _tournamentTypeRepo.Query();
HttpRuntime.Cache.Insert("TournamentTypes", _tournamentTypes);
}
return _tournamentTypes;
}
}
顯然代碼在這裏運行的是我的最後一次嘗試。註釋掉的代碼是我嘗試過的以前的版本。既沒有工作。只要我註釋掉所有緩存,並且只需撥打_tournamentTypeRepo.Query()
,一切正常。
我需要在這裏使用不同類型的緩存機制嗎?
編輯:我有新的信息,可以幫助這裏...
,當我從本地主機上運行,這只是發生。只要下面的代碼到達我的測試環境(託管在AppHarbor上),它似乎工作得很好(至少它不會拋出異常說會話已關閉,或nullreferenceexception)。
任何其他想法爲什麼這不會只在本地主機上工作?我希望在我的應用程序中推動這種方法來加速它,但是如果我無法在我的本地主機環境中測試這個方法,那麼對於做任何事情我都會非常害羞。
*「是否有不同類型的緩存機制..」*你檢查過NHibernate緩存嗎?查詢緩存,對象緩存......他們是如何工作的?那麼他們肯定不會緩存IQueryable ...他們緩存最終的SQL Select ... – 2015-02-12 06:14:16
[facepalm]沒有。從來沒有想過。我一定會嘗試。 – ganders 2015-02-12 06:19:18
然後你的第一步應該到這裏:nhibernate.info/doc/nh/en/index.html#performance-cache。此外,請檢查此更多詳細信息:http://stackoverflow.com/a/26500666/1679310,它應該提供有關如何工作的所有詳細信息 – 2015-02-12 06:54:52