hibernate session問題大總結

openSessionInView的做用!數據庫

OpenSessionInViewFilter是Spring提供的一個針對Hibernate的一個支持類,其主要意思是在發起一個頁面請求時打開Hibernate的Session,一直保持這個Session,直到這個請求結束,具體是經過一個Filter來實現的。因爲Hibernate引入了Lazy Load特性,使得脫離Hibernate的Session週期的對象若是再想經過getter方法取到其關聯對象的值,Hibernate會拋出一個LazyLoad的Exception。因此爲了解決這個問題,Spring引入了這個Filter,使得Hibernate的Session的生命週期變長。安全

hibernate經過sessionFactory有兩種方式獲取session:一種是openSession,一種是getCurrentSessionsession

openSession建立session時autoCloseSessionEnabled參數爲false,即在事物結束後不會自動關閉session, 那麼必須顯示的關閉session,也就是調用session.close()方法。這樣commit後,session並無關閉,若是不關閉將致使session關聯的數據庫鏈接沒法釋放,最後資源耗盡而使程序當掉。    hibernate

getCurrentSession建立session時autoCloseSessionEnabled,flushBeforeCompletionEnabled都爲true,而且session會同sessionFactory組成一個map以sessionFactory爲主鍵綁定到當前線程。Session 在第一次被使用的時候,即第一次調用getCurrentSession()的時候,其生命週期就開始。而後她被Hibernate綁定到當線程

前線程。當事物結束的時候,無論是提交仍是回滾,Hibernate會自動把Session從當前線程剝離,而且關閉。若在次調用 getCurrentSession(),會獲得一個新的Session,而且開始一個新的工做單元。這是Hibernate最普遍的thread- bound model,支持代碼靈活分層(事物劃分和數據訪問代碼的分離)。用戶能夠再也不考慮session的管理,事務的開啓關閉.只需配置事務便可.
 <property name="current_session_context_class">thread</property>對象

hibernate session爲何線程不安全? 解決方案?blog

http://fengbin2005.iteye.com/blog/1160428生命週期

其實ThreadLocal並不是是一個線程的本地實現版本,它並非一個Thread,而是thread local variable(線程局部變量)。也許把它命名爲ThreadLocalVar更加合適。線程事務

局部變量(ThreadLocal)其實的功用很是簡單, 就是爲每個使用該變量的線程都提供一個變量值的副本,是每個線程均可以獨立地改變本身的副本,而不會和其它線程的副本衝突。從線程的角度看,就好像每 一個線程都徹底擁有一個該變量。資源

hibernate  session與事物的關聯。

http://aixiangct.blog.163.com/blog/static/9152246120113652732924/

相關文章
相關標籤/搜索