當spring和hibernate 整合後,事務不起作用
解決辦法:通過Spring的SessionFactory的getCurrentSession的方法創建Session
一、首先說一下hibernate中創建用來連接數據庫的Session,有兩種方式。
1.通過Spring的SessionFactory的getCurrentSession的方法創建Session 。
2.通過Spring的SessionFactory的OpenSession的方法創建Session。
getCurrentSession 創建的Session會綁定到當前線程中去,commit或rollback後會,自動關閉Session。
OpenSession 重新開啓一個線程創建Session,需要手動關閉Session,如果不關閉將導致session關聯的數據庫連接無法釋放,最後資源耗盡而使程序當掉。 。
二、而當hibernate利用spring中的綁定事務來配置的時候如下圖:
配置事務是,需要將數據庫中的數據源,注入 HibernateTransactionManager可以說,事務的配置是,針對於數據庫來說的。(我是這麼理解的)
所以,當我們採用OpenSession來創建Session來連接數據庫的話,和事務連接數據庫是兩個線程的操作,所以事務根本不會起作用。
應該採用getCurrentSession進行session的創建。