二級(jí)緩存&查詢緩存

屬于SessionFactory級(jí)別的緩存嚣崭,可以在多個(gè)session之間共享數(shù)據(jù)。

image.png

實(shí)用場(chǎng)合

      1.公開(kāi)的數(shù)據(jù), 數(shù)據(jù)基本上不發(fā)生變化
      2.該數(shù)據(jù)保密性不是很強(qiáng)
      3.需要引入第三 方的緩存工具,如 EhCache 等演侯。

生命周期
二級(jí)緩存的生命周期和sessionFactory是一致的。

開(kāi)發(fā)流程
1.1. 第一步:開(kāi)啟二級(jí)緩存

別忘記依賴


image.png

在核心配置hibernate.cfg.xml新增

<property name="hibernate.cache.use_second_level_cache">true</property>

啟用二級(jí)緩存,hibernate 二級(jí)緩存是一個(gè)規(guī)范接口,沒(méi)有實(shí)現(xiàn)

1.2. 第二步:指定二級(jí)緩存實(shí)現(xiàn)廠商
在核心配置hibernate.cfg.xml新增,實(shí)現(xiàn)廠商眯漩。
設(shè)置二級(jí)緩存的供應(yīng)商 Idea中沒(méi)有這個(gè)key的提示需手動(dòng)輸入


<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>

1.3. 第三步:在映射文件中開(kāi)啟具體的緩存支持
*.hbm.xml中指定哪個(gè)類(lèi)開(kāi)啟二級(jí)緩存

image.png

二級(jí)緩存一般設(shè)置為只讀
二級(jí)緩存緩存的僅僅是對(duì)象,如果查詢出來(lái)的是對(duì)象的一部分屬性(返回Object[]),則不會(huì)加到緩存中去赦抖。

1.4. 第四步:開(kāi)發(fā)

第一次查詢舱卡,從DB取記錄,關(guān)閉Session.第二次新 session查詢队萤,沒(méi)有走DB轮锥,直接從二級(jí)緩存取得記錄。

public void testTwoCache(){
Session session1 = HibernateUtils.openSession();
Session session2 = HibernateUtils.openSession();
BookTypeEntity bookTypeEntity = session1.get(BookTypeEntity.class, 31L);
System.out.println(bookTypeEntity.getTypeName());
session1.close();
//第二次查詢 走二級(jí)緩存要尔,不查DB
BookTypeEntity bookTypeEntity2 = session2.get(BookTypeEntity.class, 31L);
System.out.println(bookTypeEntity2.getTypeName());
session2.close();

}

注意:這里的POJO可以不用序列化舍杜。但是如果這個(gè)對(duì)象需要存儲(chǔ)到具體的硬盤(pán)中的時(shí)候,是需要序列化盈电。

注意:測(cè)試二級(jí)緩存需要保持關(guān)聯(lián)表為默認(rèn)的延遲檢索機(jī)制lazy=true,因?yàn)榧虞d關(guān)聯(lián)表二級(jí)緩存支持不夠蝴簇。

不足: 二級(jí)緩存對(duì)于立即加載的支持還是很差的


image.png

測(cè)試:


image.png

現(xiàn)象:
第二次查詢還是發(fā)生的SQL查詢。

二級(jí)緩存不足:

1匆帚,非對(duì)象不存儲(chǔ)
查詢返回的不是對(duì)象,下面的HQL不會(huì)加載到二級(jí)緩存
Select stuName from StudentInfo

2熬词,關(guān)聯(lián)支持不太好
二級(jí)緩存,不能很好解決關(guān)聯(lián)表問(wèn)題吸重。需要把所有關(guān)聯(lián)的地方改為默認(rèn)的延遲檢索互拾,不找關(guān)聯(lián)表。
主要是主表的二級(jí)緩存需保持默認(rèn)lazy="true“
若關(guān)聯(lián)表兩邊都設(shè)置為false嚎幸,部分到二級(jí)緩存颜矿,有不成功的地方。
測(cè)試:session.get(BookInfo.class, 18L)

image.png

3嫉晶,不支持Query查詢
from BookInfo where bookId=:bookId
兩次都是從數(shù)據(jù)庫(kù)找記錄

查詢緩存

也是二級(jí)緩存,支持Query
查詢緩存也是sessionFactory級(jí)別的緩存:需要在二級(jí)緩存設(shè)置的基礎(chǔ)上添加
只有當(dāng)HQL語(yǔ)句完全相同骑疆,參數(shù)設(shè)置也相同才生效
生命周期:只要一些數(shù)據(jù)放入到查詢緩存中,該緩存會(huì)一直存在替废,直到緩存中的數(shù)據(jù)被修改了箍铭,該緩存的生命周期就結(jié)束了。

2.1. 第一步:前提條件
同上椎镣,必須先配置二級(jí)緩存

2.2. 第二步:開(kāi)啟查詢緩存
在核心配置Hibernate.cfg.xml中加入

<property name="hibernate.cache.use_query_cache">true</property>

2.3. 第三步:開(kāi)發(fā)的時(shí)候需要設(shè)置查詢緩存
HQL語(yǔ)句后設(shè)置開(kāi)啟
query.setCacheable(true);//開(kāi)啟查詢緩存
注意保持默認(rèn)的lazy=true(避免關(guān)聯(lián))
代碼:

public void testQueyCache(){
Session session1 = HibernateUtils.openSession();
Session session2 = HibernateUtils.openSession();
String hql = "from BookTypeEntity where typeId=:tid";
Query<BookTypeEntity> query = session1.createQuery(hql, BookTypeEntity.class);
query.setParameter("tid",31L);
//開(kāi)啟查詢緩存
query.setCacheable(true);
BookTypeEntity singleResult = query.getSingleResult();//獲取單條記錄
System.out.println(singleResult.getTypeName());
session1.close();
//第二次查詢
Query<BookTypeEntity> query2 = session2.createQuery(hql, BookTypeEntity.class);
query2.setParameter("tid",31L);
//開(kāi)啟查詢緩存
query2.setCacheable(true);
BookTypeEntity singleResult2 = query2.getSingleResult();//獲取單條記錄
System.out.println(singleResult2.getTypeName());
session2.close();

}

若修改數(shù)據(jù)或修改HQL的參數(shù)诈火,查詢緩存不生效.
查詢緩存就是讓Query可以從二級(jí)緩存獲得內(nèi)容。僅主表非關(guān)聯(lián)信息状答。
必須保持默認(rèn)的延遲檢索方式冷守。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市惊科,隨后出現(xiàn)的幾起案子拍摇,更是在濱河造成了極大的恐慌,老刑警劉巖馆截,帶你破解...
    沈念sama閱讀 219,366評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件授翻,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)堪唐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)巡语,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人淮菠,你說(shuō)我怎么就攤上這事男公。” “怎么了合陵?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,689評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵枢赔,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我拥知,道長(zhǎng)踏拜,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,925評(píng)論 1 295
  • 正文 為了忘掉前任低剔,我火速辦了婚禮速梗,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘襟齿。我一直安慰自己姻锁,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布猜欺。 她就那樣靜靜地躺著位隶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪开皿。 梳的紋絲不亂的頭發(fā)上涧黄,一...
    開(kāi)封第一講書(shū)人閱讀 51,727評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音赋荆,去河邊找鬼笋妥。 笑死,一個(gè)胖子當(dāng)著我的面吹牛糠睡,可吹牛的內(nèi)容都是我干的挽鞠。 我是一名探鬼主播疚颊,決...
    沈念sama閱讀 40,447評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼狈孔,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了材义?” 一聲冷哼從身側(cè)響起均抽,我...
    開(kāi)封第一講書(shū)人閱讀 39,349評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎其掂,沒(méi)想到半個(gè)月后油挥,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,820評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評(píng)論 3 337
  • 正文 我和宋清朗相戀三年深寥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了攘乒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,127評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡惋鹅,死狀恐怖则酝,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情闰集,我是刑警寧澤沽讹,帶...
    沈念sama閱讀 35,812評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站武鲁,受9級(jí)特大地震影響爽雄,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜沐鼠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評(píng)論 3 331
  • 文/蒙蒙 一挚瘟、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧迟杂,春花似錦刽沾、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,017評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至监氢,卻和暖如春布蔗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背浪腐。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,142評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工纵揍, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人议街。 一個(gè)月前我還...
    沈念sama閱讀 48,388評(píng)論 3 373
  • 正文 我出身青樓泽谨,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親特漩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子吧雹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評(píng)論 2 355

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

  • 一、Hibernate查詢 查詢概述Get/load主鍵查詢對(duì)象導(dǎo)航查詢HQL查詢 : Hibernate Qu...
    奮斗的老王閱讀 850評(píng)論 0 51
  • Hibernate: 一個(gè)持久化框架 一個(gè)ORM框架 加載:根據(jù)特定的OID,把一個(gè)對(duì)象從數(shù)據(jù)庫(kù)加載到內(nèi)存中OID...
    JHMichael閱讀 1,973評(píng)論 0 27
  • Hibernate是一個(gè)開(kāi)放源代碼的對(duì)象關(guān)系映射框架涂身,它對(duì)JDBC進(jìn)行了非常輕量級(jí)的對(duì)象封裝雄卷,它將POJO與數(shù)據(jù)庫(kù)...
    蘭緣小妖閱讀 1,208評(píng)論 1 18
  • 尺有所短,寸有所長(zhǎng)蛤售,永遠(yuǎn)抱一顆謙卑的心丁鹉,才能讓自己更加完善妒潭。人生沒(méi)有完美,只有完善揣钦;歲月沒(méi)有十全十美雳灾,只有盡量。 ???
    宛若驕陽(yáng)閱讀 136評(píng)論 0 0
  • 回想一下自己17年6月來(lái)深圳前冯凹,好像從來(lái)沒(méi)有感覺(jué)到寂寞佑女,除了發(fā)燒臥床有點(diǎn)昏沉?xí)r覺(jué)得無(wú)助的寂寞外,似乎從來(lái)不覺(jué)得寂寞...
    Shakuntala閱讀 291評(píng)論 0 0