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