zoukankan      html  css  js  c++  java
  • hibernate中openSession()跟getCurrentSession()方法之间的区别

    Hibernate openSession() 和 getCurrentSession的区别

    getHiberanteTemplate 、getCurrentSession和OpenSession 
    采用getCurrentSession()创建的Session会绑定到当前的线程中去、而采用OpenSession()则不会。

    采用getCurrentSession()创建的Session在commit或rollback后会自动关闭,采用OpenSession()必须手动关闭。

    采用getCurrentSession()需要在Hibernate.cfg.xml配置文件中加入如下配置:

    如果是本地事物,及JDBC一个数据库:

    <propety name=”Hibernate.current_session_context_class”>thread</propety>

    如果是全局事物,及jta事物、多个数据库资源或事物资源:

    <propety name=”Hibernate.current_session_context_class”>jta</propety>

    使用spring的getHiberanteTemplate 就不需要考虑事务管理和session关闭的问题:

    openSession创建session时autoCloseSessionEnabled参数为false,即在事物结束后不会自动关闭session,需要手动关闭,如果不关闭将导致session关联的数据库连接无法释放,最后资源耗尽而使程序当掉。              

    getCurrentSession创建session时autoCloseSessionEnabled,flushBeforeCompletionEnabled都为true,并且session会同sessionFactory组成一个map以sessionFactory为主键绑定到当前线程。

    getCurrentSession():从上下文(配置文件current_session_context_class: thread 使用Connection自动管理;jta(java transaction api) 由Application Server提供的分布式事务管理,Tomcat本身不具备此能力,JBoss、WebLogic具备)找,如果有,则用旧的,否则创建新的,事务提交自动Close;

    getCurrentSession本地事务(本地事务:jdbc)时 要在配置文件里进行如下设置:

    如果使用的是本地事务(jdbc事务)
    <property name="hibernate.current_session_context_class">thread</property>
    如果使用的是全局事务(jta事务)
    <property name="hibernate.current_session_context_class">jta</property>

    总之:

     getCurrentSession () 使用当前的session
     openSession()         重新建立一个新的session

     在一个应用程序中,如果DAO 层使用Spring 的hibernate 模板,通过Spring 来控制session 的生命周期,则首选getCurrentSession ()。

  • 相关阅读:
    [iOS]为什么不要在init初始化方法里调用self.view
    [iOS]ARC和MRC下混编
    CollectionView的基础代码
    关于ios项目中加入webp格式的图片
    【音频】远程链接音频播放(AVPlayer)
    iOS微信支付回调和iOS9系统左上角返回的冲突解决
    【转载】iOS开发经验总结
    【转载】iOS超全开源框架、项目和学习资料汇总(4)数据库、缓存处理、图像浏览、摄像照相视频音频篇
    【转载】3分钟实现iOS语言本地化/国际化(图文详解)
    微信小程序推荐网站
  • 原文地址:https://www.cnblogs.com/Ant-soldier/p/5051478.html
Copyright © 2011-2022 走看看