關於Session is closed 的問題,目前碰到三種情況,同時有三種解決方案;
一、通過getSession()方法獲得session進行操作造成的session關閉。
這種方式獲得的session在方法執行結束之後不會自動關閉連接,也就是說我們必須通過session.close()或者releaseSession(session)來手動進行關閉,否則會造成內存泄露或者連接耗盡等問題。
如果對進行事務控制,那麼spring框架會自動爲我們關閉session,此種情況(session.close())下,會拋出異常:
- org.springframework.orm.hibernate3.HibernateSystemException: Session is closed; nested exception is org.hibernate.SessionException: Session is closed
- …
- org.hibernate.SessionException: Session is closed
解決方案:提示session已經關閉。在代碼中通過releaseSession(session)的方法來關閉session,則不會拋出異常
參考:http://blog.csdn.net/xiangsuixinsheng/article/details/6451752
二、getHibernateTemplate 和 getSession 的操作造成的session關閉
在進行兩張以上的表操作的時候,同時調用了 getHibernateTemplate 和 getSession 操作數據 ,就出現了異常:
org.springframework.orm.hibernate3.HibernateSystemException: Session is closed; nested exception is org.hibernate.SessionException: Session is closed
org.hibernate.SessionException: Session is closed
因爲在 getSession 裏面是手動設置關閉的 session,getHibernateTemplate的session是系統把我們關閉的,所以當你事務裏面調用了兩張模式,就會造成session關閉。
解決方案:全部統一使用getHibernateTemplate操作數據,這樣session就由系統關閉。