Hibernate的SessionFactory是安全執行緒的,這個SessionFactory負責建立Session執行個體,這個Session執行個體卻是非安全執行緒的。一個資料來源對應一個SessionFactory,而一個SessionFactory能產生多個Sessioni執行個體。至於為什麼,本人還沒有研究那麼深,在這裡不做任何解釋。使用Hibernate時對象的生命週期、事務的管理、資料庫的存取都與Session相關,所以這裡重點說一下這個Session。
如果希望一個對象一直處於生命週期中,就必須保證至少一個變數應用它,如所示:
表示對象的記憶體配置以及對象關係。c一直引用Customer對象,Customer對象的生命週期就不會結束,當c不在引用Customer對象時,垃圾收集器就會在某個時間點將該對象清理掉,該對象生命週期結束。關於記憶體配置和垃圾收集的資訊可以參考《深入理解Java虛擬機器:JVM進階特性與最佳實務》。
SessionFactory是一級緩衝,Session是二級緩衝,通常我們使用的j對象都是放在這個Session緩衝中的,只要Session執行個體沒有結束生命週期,那麼存放在它緩衝中的對象也不會結束生命週期。如所示,當調用Session的save方法持久化Customer對象時,Customer對象會被加入到Session緩衝中,只要Session緩衝沒有被清空,那麼Customer對象就仍處於生命週期中,那麼其他與之關聯的對象就可以調用該對象。
Session緩衝的作用:
1:減少訪問資料庫的頻率。對象放在緩衝中,從緩衝中讀取資料要比從資料庫中讀取資料更快。圖1為session中get方法的查詢時序圖
2:當緩衝中的持久化對象之間存在迴圈關聯關係時,Session會保證不出現訪問對象圖的死迴圈,以及由死迴圈引起的JVM堆疊溢位異常。
3:保證資料庫中的記錄與緩衝中相應對象保持同步。這裡涉及髒檢查及清理緩衝的機制,在此不做過多解釋。