首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在httpcontext.current.session中缓存nhibernate实体有意义吗?

在httpcontext.current.session中缓存nhibernate实体有意义吗?
EN

Stack Overflow用户
提问于 2009-10-17 22:48:18
回答 3查看 1.5K关注 0票数 1

我正在学习NHibernate,并且最近查看了一些在ASP.Net MVC项目中使用NHibernate的代码。

在此应用程序的某个部分中,从NH加载的实体将保留在(HttpContext)会话中。这样可以吗?如果您使用(NHibernate) Session-per-request模式,这样做会有任何危险吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-10-18 04:09:27

除非你真的知道你在做什么,否则我不建议你这么做。在我的脑海中:

存储在httpsession中的

  • 实体必须是完全可序列化的,否则非进程会话存储将中断。
  • 延迟加载将中断,除非您显式将该实体重新附加到新会话。

如果你想进行跨请求对话,可以查看NHibernate.Burrow,这是一个专门为此目的而设计的框架。

票数 3
EN

Stack Overflow用户

发布于 2009-10-18 11:31:20

NHibernate的“每个请求的会话”与HttpSession没有关系。session per request中的session是NHibernate ISession。在请求开始时将NHibernate.ISession存储在HttpContext.Current.Items中并在请求结束时处理它是安全的。

票数 0
EN

Stack Overflow用户

发布于 2009-10-30 10:41:32

是的,如果你是基于一个不是主键的属性来获取一个频繁使用的对象,那么缓存它是有意义的。

我的站点有一个Person类,它表示站点上的特定用户。对于任何给定的web请求,我需要多次获取当前登录的用户对象,以访问特定于当前用户的各种配置设置和属性。我没有每次都访问数据库,而是将当前用户存储在HttpContext.Items[]中,并且我有一个静态方法来检查项目缓存是否包含当前用户。如果有,返回它,如果它没有从数据库中获得它,并将它添加到缓存中,以便下次可用:

代码语言:javascript
复制
    public static Person CurrentUser
    {
        get
        {
            if(!IsAuthenticated) return null;
            Person person = (Person) HttpContext.Current.Items[HttpContext.Current.User.Identity.Name];
            if(person != null) return person;

            IPersonDao personDao = new PersonDao();
            person = personDao.getByUsernameEmail(HttpContext.Current.User.Identity.Name);
            if(person==null)
            {
                FormsAuthentication.SignOut();
                HttpContext.Current.Response.Redirect("/");
            }
            HttpContext.Current.Items[HttpContext.Current.User.Identity.Name] = person;
            return person;
        }
    }

我还将我的NHibernate会话对象存储在HttpContext.Items中,以便在HttpRequest结束时同时对会话和缓存对象进行垃圾回收,您不希望对象在会话的生命周期之后继续存在,否则可能会启动一个新会话,并且NHibernate将显示一个NHibernate.NonUniqueObjectException,因为该对象被绑定到另一个会话。

值得指出的是,NHibernate的一级缓存通过ID缓存会话访问的所有对象。如果我调用的是session.get( id ),就不需要缓存,因为NHibernate的一级缓存根据对象的id来维护对象。但在上面通过User.Identity.Name获取person对象的情况下,一级缓存不起作用,因为用户的用户名不是对象的主键。

有关HttpContext.Items http://aspnet.4guysfromrolla.com/articles/060904-1.aspx的更多信息

不要使用HttpContext.Cache,由于某些原因,它会持续到Http请求之后。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1583418

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档