關於Open Session in view的備忘

說來慚愧,這個問題早在2005年就在javaeye上被討論得很徹底了,有2個精華帖:
http://www.javaeye.com/topic/15057http://www.javaeye.com/topic/17501 

Spring有開發出OpenSessionInViewFilter這樣的東西來幫助我們在事物方法的session關閉,能在view層繼續使用同一個線程的session。
使用方法,可以參考:http://www.cnblogs.com/children/archive/2010/05/01/1725419.html

問題是明顯:如果頁面load延遲過大,比如網絡傳輸延遲(撥號用戶過多等),會導致session一直開着,數據庫的連接而得不到及時釋放,對於併發量大的internet系統,直接的後果是數據庫資源的耗盡。

Robbin與衆人討論的結果是:對於併發量大的網絡系統,請慎用OpenSessionInViewFilter。如果不用OpenSessionInViewFilter,那麼怎麼解決呢?
Robbin說用Hibernate.initialize()。
用Hibernate.initialize(),等於說,你在後臺強制去初始化級聯的對象集合,然後頁面取得的就是一個完整的po對象了,不需要open Session了。
也就是說,你並沒有利用到lazy-loading,只是你config文件裏配置了lazy-loading=true,實際上你在使用時已經強制把它變成false了。
關於Hibernate.initialize()的使用,可以參考:http://blog.csdn.net/haydenwang8287/article/details/1798094

其實,OpenSessionInView真的是Spring+struts+Hibernate框架一個繞不過去的坑,最好的辦法就是換一個framework。
比如用seam框架就從根源上解決了這個問題。seam是hibernate之父一手打造的,想必他肯定有考慮過這個問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章