代码之家  ›  专栏  ›  技术社区  ›  jeroenh

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

  •  1
  • jeroenh  · 技术社区  · 16 年前

    在这个应用程序的特定部分中,从NH加载的实体被保存在(HttpContext)会话中。如果使用(NHibernate)每请求会话模式,这可以吗,或者有任何危险吗?

    3 回复  |  直到 16 年前
        1
  •  3
  •   Mauricio Scheffer    16 年前

    除非你真的知道自己在做什么,否则我不会推荐它。不经意间:

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

    如果您想进行交叉请求对话,请签出 NHibernate.Burrow 这是一个专门为此目的而设计的框架。

        2
  •  0
  •   Paco    16 年前

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

        3
  •  0
  •   reach4thelasers    16 年前

    是的,如果基于不是主键的属性获取经常使用的对象,那么缓存该对象是有意义的。

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

        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的一级缓存通过ID缓存会话访问的所有对象。如果我调用session.get(ID),则无需缓存,因为NHibernate的一级缓存通过对象的ID维护对象。但在上述情况下,我通过User.Identity.Name获取person对象,则使用一级缓存不起作用,因为用户的用户名不是对象的主键。

    http://aspnet.4guysfromrolla.com/articles/060904-1.aspx

    不要使用HttpContext.Cache,因为某些原因,它会持续超过Http请求。