2015-02-12 66 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版本,一切都开始正常工作。

请注意,如果有人遵循这种模式,在开启延迟加载时,您将无法从缓存版本访问嵌套对象,因为访问这些子对象需要知道上下文/会话以“查询”为那个信息。