更新時間:2023-02-13 來源:黑馬程序員 瀏覽量:
Hibernate中的緩存分為一級緩存和二級緩存,這兩個級別的緩存都位于持久化層,并且存儲的都是數據庫數據的備份。圖1-6為Hibernate提供的兩種緩存,兩者區別如下:
1.一級緩存:一級緩存本質上是自帶的不可卸載的,一級緩存的生命周期與session是一致的,一級緩存稱為session級別的緩存。
2.二級緩存:默認沒有開啟,是需要手動配置才可以使用的。二級緩存的優勢在于可以在多個session中共享數據,二級緩存稱為是sessionFactory級別的緩存。
圖1-6 Hibernate提供的兩種緩存
一級緩存其實就是Session緩存。Session緩存是一塊內存空間,用于存儲與管理Java對象。在使用Hibernate查詢對象時,首先會使用對象的OID值在Hibernate的一級緩存中查找,如果找到匹配的對象,則直接將該對象從一級緩存中取出使用;如果沒有找到匹配的對象,則會去數據庫中查詢對應的數據。當從數據庫中查詢到所需數據時,該數據信息會存儲到一級緩存中。由此可知,Hibernate一級緩存的作用就是減少對數據庫的訪問次數。
·當應用程序調用Session接口的save()、update()、saveOrUpdate時,如果Session緩存中沒有相應的對象,則Hibernate就會自動把從數據庫中查詢到的相應對象信息加入到一級緩存中。
·當調用Session接口的load()、get()方法,以及Query接口的list()、iterator()方法時,會判斷緩存中是否存在該對象,有則返回,不會查詢數據庫,如果緩存中沒有要查詢的對象,則再去數據庫中查詢對應對象,并添加到一級緩存中。
·當調用Session的close()方法時,Session緩存會被清空。
·Session能夠在某些情況下,按照緩存中對象的變化,執行相關的SQL語句同步更新數據庫,這一過程被稱為刷出緩存(flush)。
在默認情況下,Sesssion在如下幾種情況中會刷出緩存。
(1)當應用程序調用Transaction的commit()方法時,該方法先刷出緩存(調用session.flush()方法),然后再向數據庫提交事務(調用commit()方法)。
(2)當應用程序執行一次查詢操作的時候,如果緩存中持久化對象的屬性已經發生了變化,會先刷出緩存,以保證查詢結果能夠反映持久化對象的最新狀態。
(3)調用Session的flush()方法。