zoukankan      html  css  js  c++  java
  • servlet的HttpSession与HibernateSession的区别

    一、javax.servlet.http.HttpSession是一个抽象接口

    它的产生:J2EE的Web程序在运行的时候,会给每一个新的访问者建立一个HttpSession,这个Session是用户身份的唯一表示。注意,是容器(Tomcat,Resin)自动创建的。

    用途:存放这个用户的一些经常被用到的信息,例如:用户名,权限。例如在购物车程序里,存放用户买的商品。

    销毁:一定时间(跟容器有关)内,用户无任何动作,session自动销毁。

    得到的方法: 
    HttpSession session = request.getSession(); 
    常用方法setAttribute 
    session.setAttribute(key,value); 
    这样在另一个jsp或者Servlet里,可以用 
    session.getAttribute(key);得到value 
    类似一个Map


    二、org.hibernate.Session

    它是hibernate操作数据库的一个句柄对象。它跟上面那个Session唯一的相似处就是名字有点像,其他没任何一样的地方。亦可以理解为数据库层和持久化层的互访载体,也可以认为是一个缓冲器,对数据库的所有CURD操作在这个session(缓存)中都有记录,一旦做个缓存commit操作,则所有对持久化对象的操作都将映射到具体的某个数据库中,完成最后的数据更新

    Session对象:使用hibernate进行数据库操作,主要使用sessionSession可以理解为对Connection对象的一个包装。Session对象中提供了对数据库的crud操作。Session是一个线程不安全的对象,生命周期非常短暂,一般和事务一一对应。Session又称为hibernate中的一级缓存。使用完马上关闭就是为了防止线程不安全问题。

    一般的Hibernate程序中,Session由用户手动获取,手动关闭。 
    正规项目中,在业务层获取Session 

    //1.新建Configuration对象

    //读取src下hibernate.perproties,不推荐使用

      //Configuration cfg1 = new Configuration();

      //cfg1.addResource();

      //cfg1.addProperties();

    //默认读取src下hibernate.cfg.xml

    Configuration cfg = new Configuration().configure();

    //如果hibernate的核心配置文件不叫hibernate.cfg.xml

    //Configuration cfg2 = new Configuration().configure("hb.cfg.xml");

    SessionFactory对象

    是一个Session工厂。是一个重量级对象,是一个线程安全的对象,属于进程级别对象。

    //2.通过Configuration创建SessionFactory对象

    //在hibernate3.x中是这样写

    //SessionFactory sf = cfg.buildSessionFactory();

    //hibernate4.3

    ServiceRegistry sr = new StandardServiceRegistryBuilder()

                                     .applySettings(cfg.getProperties())

                                     .build();

    SessionFactory sf = cfg.buildSessionFactory(sr);


    Session session = sf.openSession();

    然后把此session传给dao层,将数据持久化或其他的操作。 
    一次业务逻辑可能调用多个dao方法,例如银行转帐,是一个先减后增的过程,所以会调用2个dao里的方法(甲帐户减,乙帐户增)。因此,可以利用业务层产生的同一个Session来做这件事

    a1和a2代表帐户实体。 
    a1是甲的,a2是乙的。 
    a1.setAcount(a1.getAcount()-1000); 
    a2.setAcount(a2.getAcount()+1000); 
    dao.update(a1,session); 
    dao.update(a2,session); 
    Transaction tx = session.beginTransaction(); 
    tx.commit();

    最后在业务层,将session关闭 
    session.close(); 
    或者调用HibernateSessionFactory.closeSession(session);

    最好能加上异常捕捉,之类,如产生异常,即时回滚。保证操作不出意外。

    try{ 
    ... 
    tx.commit(); 
    }catch(Exception e){ 
    tx.rollback(); 
    }finally{ 
    HibernateSessionFactory.closeSession(session); 
    }

    默认session的时间为20分钟,如果想在这之前清除的话可以使用Session.Abandorn方法

    连接:http://blog.csdn.net/aimbetter/article/details/36667797

  • 相关阅读:
    JWT安装配置
    封装axios请求&添加拦截器
    RESTful风格
    APIView使用增删改查user
    虚拟环境
    VUE异步检查用户名和手机号(6)
    Django-celery验证用户名和手机号(5)
    vue异步发送短息短信(4)
    Django-celery异步发送信息(3)
    Django-celery异步基本配置与使用(2)
  • 原文地址:https://www.cnblogs.com/wym789/p/6371883.html
Copyright © 2011-2022 走看看