2015-02-12 32 views
0

我有幾個回收/表,被稱爲很多返回在我的網站成千上萬的行。我計劃幫助網站的性能,我應該開始緩存基礎數據,然後濾除個別頁面的數據。問題是,只要我實現了緩存,當使用/調用緩存對象時,我的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)。

任何其他想法爲什麼這不會只在本地主機上工作?我希望在我的應用程序中推動這種方法來加速它,但是如果我無法在我的本地主機環境中測試這個方法,那麼對於做任何事情我都會非常害羞。

+2

*「是否有不同類型的緩存機制..」*你檢查過NHibernate緩存嗎?查詢緩存,對象緩存......他們是如何工作的?那麼他們肯定不會緩存IQueryable ...他們緩存最終的SQL Select ... – 2015-02-12 06:14:16

+0

[facepalm]沒有。從來沒有想過。我一定會嘗試。 – ganders 2015-02-12 06:19:18

+0

然後你的第一步應該到這裏:nhibernate.info/doc/nh/en/index.html#performance-cache。此外,請檢查此更多詳細信息:http://stackoverflow.com/a/26500666/1679310,它應該提供有關如何工作的所有詳細信息 – 2015-02-12 06:54:52

回答

0

終於搞定了。仍然不確定它爲什麼在非本地主機環境中工作正常,但問題是因爲我返回了一個IQueryable對象,並且需要知道上下文/會話。只要我在對象上做了一個ToList(),並緩存了IEnumerable版本,一切都開始正常工作。

請注意,如果有人遵循這種模式,在開啓延遲加載時,您將無法從緩存版本訪問嵌套對象,因爲訪問這些子對象需要知道上下文/會話以「查詢」爲那個信息。