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