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