【轉】Hibernate之緩存機制(一級緩存)

Hibernate緩存是一種提高系統性能的比較好的工具,如果使用合理,則能極大地提高系統性能,但如果使用不合理

也會使系統性能下降。Hibernate緩存比較複雜,要想靈活使用hibernate緩存,必須深入研究Hibernate緩存原理。

Session緩存(一級緩存):當調用Session的保存、更新、查詢操作時,在Session緩存中不存在相應對象,則把這些

對象加入Session緩存。同一個Session操作,第一次通過ID調用load()或get()查詢持久對象,先從Session緩存中

查詢,隨即發送一條SQL語句生成一個持久對象並把該對象放入Session緩存。第二次再通過相同ID調用load()

或get()查詢時將直接從Session緩存將該對象返回,避免多餘的數據庫連接和查詢的開銷。

Session的load()和get()方法使用區別:

1、當數據庫不存在對應ID數據時,調用load()方法將會拋出ObjectNotFoundException異常,get()方法將返回null.

2、當對象.hbm.xml配置文件<class>元素的lazy屬性設置爲true時,調用load()方法時則返回持久對象的代理類實例

此時的代理類實例是由運行時動態生成的類,該代理類實例包括原目標對象的所有屬性和方法,該代理類實例的屬性

除了ID不爲null外,所在屬性爲null值,查看日誌並沒有Hibernate SQL輸出,說明沒有執行查詢操作,當代理類實例

通過getXXX()方法獲取屬性值時,Hiberante才真正執行數據庫查詢操作。當對象.hbm.xml配置文件<class>元素的

lazy屬性設置爲false時,調用load()方法則是立即執行數據庫並直接返回實體類,並不返回代理類。

而調用get()方法時不管lazy爲何值,都直接返回實體類。

3、load()和get()都會先從Session緩存中查找,如果沒有找到對應的對象,則查詢Hibernate二級緩存,

再找不到該對象,則發送一條SQL語句查詢。

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