【问题标题】:Caching on localhost is closing my NHibernate session在 localhost 上缓存正在关闭我的 NHibernate 会话
【发布时间】: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


【解决方案1】:

终于弄明白了。仍然不确定为什么它在非本地主机环境中可以正常工作,但问题是因为我返回了一个 IQueryable 对象,并且需要知道上下文/会话。一旦我对对象执行了 ToList() 并缓存了 IEnumerable 版本,一切都开始完美运行。

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

【讨论】:

    猜你喜欢
    • 2011-11-07
    • 1970-01-01
    • 2010-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多