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 ()。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM