【发布时间】:2015-04-12 18:22:13
【问题描述】:
我有一些 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)。
关于为什么这仅在本地主机上不起作用的任何其他想法?我想在我的应用程序中实施这种方法以加快速度,但如果我无法在我的本地主机环境中测试它,我会非常害怕做任何事情。
【问题讨论】:
-
"..是否有不同类型的缓存机制.." 你检查过 NHibernate 缓存吗?查询缓存、对象缓存……它们是如何工作的?好吧,他们肯定不会缓存 IQueryable... 他们缓存最终的 SQL Select...
-
[facepalm] 没有。我什至从来没有想过。我一定会尝试的。
-
那么你的第一步应该去这里:nhibernate.info/doc/nh/en/index.html#performance-cache。另外,请查看此以获取更多详细信息:stackoverflow.com/a/26500666/1679310,它应该提供有关其工作原理的所有详细信息
-
我不相信上面的例子对我有用,因为我不能使用 SqlDependency。我仍然对为什么标准的 asp.net 缓存会影响我的 NHibernate 会话感到困惑。我应该将这些值保存为 List() 而不是 IQueryable?
-
@RadimKöhler 所以我今天在 SO 上进行了更多搜索,发现了在 .NET 4.0 中实现的 MemoryCache 功能。它提到这是新的/建议的缓存方法。旧风格是否有可能不再适用于 [使用 NHibernate]?这是我要尝试的实现的链接:stackoverflow.com/questions/17653124/…
标签: c# asp.net-mvc caching nhibernate