二級(jí)緩存
hibernate的session緩存
在事務(wù)級(jí)別進(jìn)行持久化數(shù)據(jù)的緩存操作砾脑。 當(dāng)然,也有可能分別為每個(gè)類(或集合)艾杏,配置集群韧衣、或 JVM 級(jí)別(SessionFactory 級(jí)別)的緩存。你甚至可以為之插入一個(gè)集群的緩存购桑。注意畅铭,緩存永遠(yuǎn)不知道其他應(yīng)用程序?qū)Τ志没瘋}(cāng)庫(kù)(數(shù)據(jù)庫(kù))可能進(jìn)行的修改 (即使可以將緩存數(shù)據(jù)設(shè)定為定期失效)。
session緩存 :
session緩存是由一系列的Java集合構(gòu)成的勃蜘。當(dāng)一個(gè)對(duì)象被加入到Session緩存中硕噩,這個(gè)對(duì)象的引用就加入到了java的集合中,以后即使應(yīng)用程序中的引用變量不再引用該對(duì)象缭贡,只要Session緩存不被清空炉擅,這個(gè)對(duì)象一直處于生命周期中。session作用:
1)減少訪問(wèn)數(shù)據(jù)庫(kù)的頻率阳惹。
2)保證緩存中的對(duì)象與數(shù)據(jù)庫(kù)中的相關(guān)記錄保持同步谍失。Session清理緩存的時(shí)機(jī):
1)當(dāng)調(diào)用Transaction的commit()方法時(shí),commit()方法先清理緩存(前提是FlushMode.COMMIT/AUTO)穆端,然后再向數(shù)據(jù)庫(kù)提交事務(wù)袱贮。
2)當(dāng)應(yīng)用程序調(diào)用Session的find()或者iterate()時(shí)仿便,如果緩存中的持久化對(duì)象
的屬性發(fā)生了變化体啰,就會(huì)先清理緩存,以保證查詢結(jié)果能反映持久化對(duì)象的最新
狀態(tài)嗽仪。
3)當(dāng)應(yīng)用程序顯示調(diào)用Session的flush()方法的時(shí)候荒勇。
Hibernate對(duì)象的狀態(tài)
1)瞬時(shí)態(tài)Transient:
含義:由new操作符創(chuàng)建,且尚未與Hibernate Session關(guān)聯(lián)的對(duì)象闻坚。處于瞬時(shí)態(tài)的java對(duì)象成為臨時(shí)對(duì)象沽翔。
特點(diǎn):不處于Session的緩存中,即不被任何一個(gè)Session實(shí)例關(guān)聯(lián)窿凤。
在數(shù)據(jù)庫(kù)中沒(méi)有對(duì)應(yīng)的記錄仅偎。2)持久態(tài)Persistent
含義:已經(jīng)被持久化,加入到Session的緩存中雳殊,處于持久化狀態(tài)的java對(duì)象被稱為持久化對(duì)象橘沥。
特點(diǎn):位于一個(gè)Session實(shí)例的緩存中。
持久化對(duì)象在數(shù)據(jù)庫(kù)中有相應(yīng)的記錄夯秃,Session在清理緩存時(shí)座咆,會(huì)根據(jù)持久化對(duì)象的屬性變化來(lái)同步更新數(shù)據(jù)庫(kù)痢艺。
當(dāng)一個(gè)持久化對(duì)象關(guān)聯(lián)一個(gè)臨時(shí)對(duì)象,在允許級(jí)聯(lián)保存的情況下介陶,Session在清理緩存的時(shí)候會(huì)把這個(gè)臨時(shí)對(duì)象也轉(zhuǎn)變?yōu)槌志没瘜?duì)象堤舒。3)脫管態(tài)Detached
含義:已經(jīng)被持久化,但不再處于Session的緩存中哺呜,處于脫管狀態(tài)的java對(duì)象稱為游離對(duì)象舌缤。
特點(diǎn):不再位于Session的緩存中,即不被Session關(guān)聯(lián)某残。
游離對(duì)象是由持久化對(duì)象轉(zhuǎn)變過(guò)來(lái)的友驮,因此在數(shù)據(jù)庫(kù)存在與之對(duì)應(yīng)的記錄(前提是沒(méi)有其他程序刪除了這條記錄)。hibernate對(duì)象狀態(tài)裝換圖如下圖所示:
Session API :
Session接口是Hibernate向應(yīng)用程序提供的操縱數(shù)據(jù)庫(kù)的最主要的接口驾锰,它提供了基本的保存卸留,更新,刪除和查詢的方法椭豫。
-
save():把一個(gè)臨時(shí)對(duì)象加入到緩存中耻瑟,使它變成持久化對(duì)象
如果在save()方法之后,又修改了持久化對(duì)象的屬性赏酥,會(huì)使得Session在清理緩存的時(shí)候額外執(zhí)行SQL update語(yǔ)句喳整。
注意:save()方法是用來(lái)持久化一個(gè)臨時(shí)對(duì)象的!
-
update():把Object對(duì)象重新加入到Session緩存中裸扶,使之變?yōu)槌志没瘜?duì)象框都。
計(jì)劃一條update語(yǔ)句,只有在清理緩存的時(shí)候才會(huì)執(zhí)行呵晨,并且在執(zhí)行的時(shí)候才會(huì)把參數(shù)對(duì)象中的屬性值組裝到update語(yǔ)句中魏保。
注意:update()是將一個(gè)游離對(duì)象轉(zhuǎn)變?yōu)槌志没瘜?duì)象的。
saveOrUpdate():同時(shí)包含了save()與update()方法的功能摸屠,如果傳入的參數(shù)是臨時(shí)對(duì)象谓罗,調(diào)用save方法,如果參入?yún)?shù)是游離對(duì)象季二,調(diào)用update()方法檩咱,如果傳入的是持久化對(duì)象,直接返回胯舷。
load()/get():都會(huì)根據(jù)給定的OID從數(shù)據(jù)庫(kù)中加載一個(gè)持久化對(duì)象刻蚯,區(qū)別在于,當(dāng)數(shù)據(jù)庫(kù)中不存在與OID對(duì)應(yīng)的記錄時(shí)桑嘶,load()方法會(huì)拋出ObjectNotFoundException異常炊汹,而get()方法返回null。
delete():于從數(shù)據(jù)庫(kù)中刪除與參數(shù)對(duì)象對(duì)應(yīng)的記錄不翩,如果傳入的參數(shù)是持久化對(duì)象兵扬,Session就計(jì)劃執(zhí)行一個(gè)delete語(yǔ)句麻裳,如果傳入的參數(shù)是游離對(duì)象,先使游離對(duì)象被Session關(guān)聯(lián)器钟,使它變?yōu)槌志没瘜?duì)象津坑,然后計(jì)劃一個(gè)delete語(yǔ)句,在清理緩存的時(shí)候執(zhí)行傲霸。
evict():從緩存中清除參數(shù)指定的持久化對(duì)象疆瑰。
clear():清空緩存中所有持久化對(duì)象。