在本地主机上缓存正在关闭我的 NHibernate 会话

Caching on localhost is closing my NHibernate session

我有一些 repos/tables 经常被调用,在我的网站上返回了数千行。我想帮助提高网站的性能,我应该开始缓存基础数据,然后过滤掉单个页面的数据。问题是,一旦我实现缓存,当缓存对象为 used/called.

时,我的 NHibernate 会话就会关闭

我正在使用 MVC 4、Ninject 和存储库模式。

我在我的页面上创建了一个 属性 来处理对缓存对象的访问,仅用于概念验证。我稍后会重构它自己的 class...

无论如何,这是代码:

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)。

关于为什么这不能只在本地主机上工作的任何其他想法?我想在我的应用程序中推动这种方法来加速它,但如果我不能在我的本地主机环境中测试它,我会非常害羞地做任何事情。

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

注意,如果有人遵循这种模式,当延迟加载打开时,您将无法从缓存版本访问嵌套对象,因为访问这些子对象需要知道 context/session "query" 获取该信息。