Hibernate session的緩存

                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:保證數據庫中的記錄與緩存中相應對象保持同步。這裏涉及髒檢查及清理緩存的機制,在此不做過多解釋。

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