Hibernate緩存原理與策略

Hibernate緩存原理:

對于Hibernate這類ORM而言,緩存顯的尤為重要,它是持久層性能提升的關鍵.簡單來講Hibernate就是對JDBC進行封裝,以實現(xiàn)內(nèi)部狀態(tài)的管理,OR關系的映射等,但隨之帶來的就是數(shù)據(jù)訪問效率的降低,和性能的下降,而緩存就是彌補這一缺點的重要方法.

緩存就是數(shù)據(jù)庫數(shù)據(jù)在內(nèi)存中的臨時容器,包括數(shù)據(jù)庫數(shù)據(jù)在內(nèi)存中的臨時拷貝,它位于數(shù)據(jù)庫與數(shù)據(jù)庫訪問層中間.ORM在查詢數(shù)據(jù)時首先會根據(jù)自身的緩存管理策略,在緩存中查找相關數(shù)據(jù),如發(fā)現(xiàn)所需的數(shù)據(jù),則直接將此數(shù)據(jù)作為結果加以利用,從而避免了數(shù)據(jù)庫調(diào)用性能的開銷.而相對內(nèi)存操作而言,數(shù)據(jù)庫調(diào)用是一個代價高昂的過程.

一般來講ORM中的緩存分為以下幾類:

1:事務級緩存:即在當前事務范圍內(nèi)的數(shù)據(jù)緩存.就Hibernate來講,事務級緩存是基于Session的生命周期實現(xiàn)的,每個Session內(nèi)部會存在一個數(shù)據(jù)緩存,它隨著 Session的創(chuàng)建而存在,隨著Session的銷毀而滅亡,因此也稱為Session Level Cache.

2:應用級緩存:即在某個應用中或應用中某個獨立數(shù)據(jù)庫訪問子集中的共享緩存,此緩存可由多個事務共享(數(shù)據(jù)庫事務或應用事務),事務之間的緩存共享策略與應用的事務隔離機制密切相關.在Hibernate中,應用級緩存由SessionFactory實現(xiàn),所有由一個SessionFactory創(chuàng)建的 Session實例共享此緩存,因此也稱為SessionFactory Level Cache.

3:分布式緩存:即在多個應用實例,多個JVM間共享的緩存策略.分布式緩存由多個應用級緩存實例組成,通過某種遠程機制(RMI,JMS)實現(xiàn)各個緩存實例間的數(shù)據(jù)同步,任何一個實例的數(shù)據(jù)修改,將導致整個集群間的數(shù)據(jù)狀態(tài)同步.

Hibernate的一啤覆,二級緩存策略:

Hibernate中提供了兩級Cache,第一級別的緩存是Session級別的緩存,它是屬于事務范圍的緩存。這一級別的緩存由hibernate管理的皂岔,一般情況下無需進行干預;第二級別的緩存是SessionFactory級別的緩存椒袍,它是屬于進程范圍或群集范圍的緩存坛吁。這一級別的緩存可以進行配置和更改,并且可以動態(tài)加載和卸載彤委,屬于多事務級別鞭铆,要防止事務并發(fā)性。

緩存是以map的形式進行存儲的(key-id,value-object)

一級緩存(Session):

事務范圍焦影,每個事務(Session)都有單獨的第一級緩存.

一級緩存的管理:當應用程序調(diào)用Session的save()车遂、update()、saveOrUpdate()斯辰、get()或load()舶担,以及調(diào)用查詢接口的 list()、iterate()--(用的是n+1次查詢彬呻,先查id)或filter()方法時衣陶,如果在Session緩存中還不存在相應的對象,Hibernate就會把該對象加入到第一級緩存中闸氮。當清理緩存時剪况,Hibernate會根據(jù)緩存中對象的狀態(tài)變化來同步更新數(shù)據(jù)庫。 Session為應用程序提供了兩個管理緩存的方法: evict(Object obj):從緩存中清除參數(shù)指定的持久化對象蒲跨。 clear():清空緩存中所有持久化對象,flush():使緩存與數(shù)據(jù)庫同步译断。

當查詢相應的字段如(name),而不是對象時财骨,不支持緩存镐作。

Session接口為應用程序提供了兩個管理緩存的方法:

1>evict()方法:用于將某個對象從Session的一級緩存中清除;

2>clear()方法:用于將一級緩存中的所有對象全部清楚隆箩;

注:緩存同步策略的困擾,就是當使用session查詢實體時,如果對實體進行了修改,flush時他就會自動與數(shù)據(jù)庫同步,從而導致數(shù)據(jù)丟失,固有以下解決方案:

一級緩存是和session的生命周期相同的该贾,也就是說在同一個session中,除非你調(diào)用clear()/evict()方法捌臊,否則不會出現(xiàn)“第二個緩存”杨蛋,這個引號是指就算出現(xiàn)第二個其實也是同一個,只不過是對緩存做了操作理澎。?所以要避免他的緩存同步策略逞力,最好使用hql/sql,這兩個是對實體中屬性的查詢糠爬,而不是session對實體的查詢

二級緩存(SessionFactory):

Hibernate的二級緩存策略的一般過程如下:

1:條件查詢的時候寇荧,總是發(fā)出一條select * from table_name where …. (選擇所有字段)這樣的SQL句查詢數(shù)據(jù)庫,一次獲得所有的數(shù)據(jù)對象(這個問題要考慮执隧,如果你查詢十萬條數(shù)據(jù)時揩抡,內(nèi)存不是被占用)户侥。

2:把獲得的所有數(shù)據(jù)對象根據(jù)ID放入到第二級緩存中。

3: 當Hibernate根據(jù)ID訪問數(shù)據(jù)對象的時候峦嗤,首先從Session一級緩存中查蕊唐;查不到,如果配置了二級緩存烁设,那么從二級緩存中查替梨;查不到,再查詢數(shù)據(jù)庫装黑,把結果按照ID放入到緩存副瀑。

4:刪除、更新曹体、增加數(shù)據(jù)的時候俗扇,同時更新緩存。

Hibernate的二級緩存策略箕别,是針對于ID查詢的緩存策略铜幽,對于條件查詢則毫無作用。為此串稀,Hibernate提供了針對條件查詢的Query Cache除抛。

Q:什么樣的數(shù)據(jù)適合存放到第二級緩存中?

1.很少被修改的數(shù)據(jù)

2.不是很重要的數(shù)據(jù)母截,允許出現(xiàn)偶爾并發(fā)的數(shù)據(jù)

3.不會被并發(fā)訪問的數(shù)據(jù)

4.參考數(shù)據(jù),指的是供應用參考的常量數(shù)據(jù)到忽,它的實例數(shù)目有限,它的實例會被許多其他類的實例引用清寇,實例極少或者從來不會被修改喘漏。

不適合存放到第二級緩存的數(shù)據(jù)?

1 經(jīng)常被修改的數(shù)據(jù)

2 財務數(shù)據(jù)华烟,絕對不允許出現(xiàn)并發(fā)

3 與其他應用共享的數(shù)據(jù)翩迈。

常用的緩存插件 Hibernater 的二級緩存是一個插件,下面是幾種常用的緩存插件:

EhCache:可作為進程范圍的緩存盔夜,存放數(shù)據(jù)的物理介質(zhì)可以是內(nèi)存或硬盤负饲,對Hibernate的查詢緩存提供了支持。

OSCache:可作為進程范圍的緩存喂链,存放數(shù)據(jù)的物理介質(zhì)可以是內(nèi)存或硬盤返十,提供了豐富的緩存數(shù)據(jù)過期策略,對Hibernate的查詢緩存提供了支持椭微。

SwarmCache:可作為群集范圍內(nèi)的緩存洞坑,但不支持Hibernate的查詢緩存。

JBossCache:可作為群集范圍內(nèi)的緩存蝇率,支持事務型并發(fā)訪問策略迟杂,對Hibernate的查詢緩存提供了支持匈仗。

配置二級緩存的主要步驟:

1 選擇需要使用二級緩存的持久化類,設置它的命名緩存的并發(fā)訪問策略逢慌。這是最值得認真考慮的步驟。

2 選擇合適的緩存插件间狂,然后編輯該插件的配置文件攻泼。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市鉴象,隨后出現(xiàn)的幾起案子忙菠,更是在濱河造成了極大的恐慌,老刑警劉巖纺弊,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件牛欢,死亡現(xiàn)場離奇詭異,居然都是意外死亡淆游,警方通過查閱死者的電腦和手機傍睹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來犹菱,“玉大人拾稳,你說我怎么就攤上這事±巴眩” “怎么了访得?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長陕凹。 經(jīng)常有香客問我悍抑,道長,這世上最難降的妖魔是什么杜耙? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任搜骡,我火速辦了婚禮,結果婚禮上泥技,老公的妹妹穿的比我還像新娘浆兰。我一直安慰自己,他們只是感情好珊豹,可當我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布簸呈。 她就那樣靜靜地躺著,像睡著了一般店茶。 火紅的嫁衣襯著肌膚如雪蜕便。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天贩幻,我揣著相機與錄音轿腺,去河邊找鬼两嘴。 笑死,一個胖子當著我的面吹牛族壳,可吹牛的內(nèi)容都是我干的憔辫。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼仿荆,長吁一口氣:“原來是場噩夢啊……” “哼贰您!你這毒婦竟也來了?” 一聲冷哼從身側響起拢操,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤锦亦,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后令境,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體杠园,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年舔庶,在試婚紗的時候發(fā)現(xiàn)自己被綠了抛蚁。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡栖茉,死狀恐怖篮绿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情吕漂,我是刑警寧澤亲配,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站惶凝,受9級特大地震影響吼虎,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜苍鲜,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一思灰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧混滔,春花似錦洒疚、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至领跛,卻和暖如春乏德,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工喊括, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留胧瓜,地道東北人。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓郑什,卻偏偏與公主長得像府喳,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蘑拯,可洞房花燭夜當晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容