getHiberanteTemplate 、getCurrentSession和OpenSession
採用getCurrentSession()建立的Session會綁定到當前的線程中去、而採用OpenSession()則不會。java
採用getCurrentSession()建立的Session在commit或rollback後會自動關閉,採用OpenSession()必須手動關閉。spring
採用getCurrentSession()須要在Hibernate.cfg.xml配置文件中加入以下配置:數據庫
若是是本地事物,及JDBC一個數據庫:api
<propety name=」Hibernate.current_session_context_class」>thread</propety>session
若是是全局事物,及jta事物、多個數據庫資源或事物資源:分佈式
<propety name=」Hibernate.current_session_context_class」>jta</propety>hibernate
使用spring的getHiberanteTemplate 就不須要考慮事務管理和session關閉的問題:線程
openSession建立session時autoCloseSessionEnabled參數爲false,即在事物結束後不會自動關閉session,須要手動關閉,若是不關閉將致使session關聯的數據庫鏈接沒法釋放,最後資源耗盡而使程序當掉。 xml
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 ()。