我有几个回收/表,被称为很多返回在我的网站成千上万的行。我计划帮助网站的性能,我应该开始缓存基础数据,然后滤除个别页面的数据。问题是,只要我实现了缓存,当使用/调用缓存对象时,我的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