我有几个repos / tables被称为在我的网站上返回数千行。我想帮助网站的性能,我应该开始缓存基础数据,然后过滤掉各个页面的数据。问题是,只要我实现缓存,我的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()
,一切正常。
我需要在这里使用不同类型的缓存机制吗?
编辑:我已经获得了可能有用的新信息......
这只发生在我从localhost运行时。一旦下面的代码进入我的测试环境(托管在AppHarbor上),它似乎工作得很好(至少它没有抛出会话被关闭的异常,或者是一个nullreferenceexception)。
关于为什么这不仅仅适用于localhost的任何其他想法?我希望在我的应用程序中加速这种方法以加快速度,但是如果我无法在我的localhost环境中测试它,那么我会毫不犹豫地做任何事情。
答案 0 :(得分:0)
终于搞清楚了。仍然不确定为什么它在非localhost环境中工作正常,但问题是因为我正在返回一个IQueryable对象,并且需要知道上下文/会话。一旦我在对象上做了一个ToList(),并缓存了IEnumerable版本,一切都开始完美。
请注意,如果有人遵循此模式,则在启用延迟加载时,您将无法从缓存版本访问嵌套对象,因为访问这些子对象需要知道上下文/会话到&#34;查询&#34;对于那些信息。