在localhost上缓存正在关闭我的NHibernate会话

时间:2015-02-12 05:54:32

标签: c# asp.net-mvc caching nhibernate

我有几个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环境中测试它,那么我会毫不犹豫地做任何事情。

1 个答案:

答案 0 :(得分:0)

终于搞清楚了。仍然不确定为什么它在非localhost环境中工作正常,但问题是因为我正在返回一个IQueryable对象,并且需要知道上下文/会话。一旦我在对象上做了一个ToList(),并缓存了IEnumerable版本,一切都开始完美。

请注意,如果有人遵循此模式,则在启用延迟加载时,您将无法从缓存版本访问嵌套对象,因为访问这些子对象需要知道上下文/会话到&#34;查询&#34;对于那些信息。