7民效、查詢緩存(一級緩存)(mybatis筆記)

一憔维、緩存概述

  • mybatis提供查詢緩存涛救,用于減輕數(shù)據(jù)庫的壓力,提高數(shù)據(jù)庫的性能业扒。mybatis提供一級緩存和二級緩存检吆。

  • 一級緩存就是SqlSession級別的緩存。在操作數(shù)據(jù)庫時不要構(gòu)造SqlSession對象程储,在對象中有一個數(shù)據(jù)結(jié)構(gòu)(HashMap)用于存儲緩存數(shù)據(jù)蹭沛,不同的SqlSession之間的緩存數(shù)據(jù)區(qū)域(HashMap中)是互相不影響的。

  • 二級緩存是mapper級別的緩存章鲤,可以實現(xiàn)SqlSession之間的共享摊灭。多個SqlSession去操作同一個mappersql語句,多個SqlSession去操作數(shù)據(jù)庫得到數(shù)據(jù)會緩存在二級緩存區(qū)域败徊,二級緩存是跨SqlSession帚呼。

  • 為什么要用緩存?
    如果緩存中有數(shù)據(jù)則不需要從數(shù)據(jù)庫中來獲取數(shù)據(jù)了,大大提高系統(tǒng)的性能煤杀。

二眷蜈、一級緩存

2.1 原理

  • 第一次發(fā)起查詢用戶id為1的用戶信息,先去找緩存中是否有此信息沈自,如果沒有則從數(shù)據(jù)庫中查詢酌儒,得到此信息之后將其存儲到一級緩存中,而第二次查詢的時候發(fā)現(xiàn)緩存中有則不會去查數(shù)據(jù)庫枯途,直接從緩存中獲取即可忌怎。

  • 如果在兩次查詢之間SqlSession去執(zhí)行commit操作(執(zhí)行插入、更新酪夷、刪除)呆躲,此時會清空SqlSession中的一級緩存,那么第二次查詢在緩存中就找不到數(shù)據(jù)了捶索,需要從數(shù)據(jù)庫中查詢插掂,這樣做的目的就是避免臟數(shù)據(jù),讓緩存中存儲的是最新信息腥例。

2.2 測試(工程mybatis12

mybatis默認(rèn)支持一級緩存辅甥,不需要在配置文件中開啟。按照上面的一級緩存的原理步驟去測試燎竖。

UserMapperTest.java

    //一級緩存測試
    @Test
    public void testCache1() throws Exception{
        SqlSession sqlSession = sqlSessionFactory.openSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class); 
        
        //下面兩次查詢使用的是同一個SqlSession
        //第一次發(fā)起請求璃弄,查詢id為1的用戶
        User user1 = userMapper.findUserById(1);
        System.out.println(user1);

        //第二次發(fā)起請求,查詢id為1的用戶
        User user2 = userMapper.findUserById(1);
        System.out.println(user1);
        sqlSession.close();
    }

此時查詢結(jié)果為:

1

可以看到兩次查詢只是發(fā)出了一條sql語句构回。
此時我們在兩次查詢之間加入更新操作:

    //一級緩存測試
    @Test
    public void testCache1() throws Exception{
        SqlSession sqlSession = sqlSessionFactory.openSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class); 
        
        //下面兩次查詢使用的是同一個SqlSession
        //第一次發(fā)起請求夏块,查詢id為1的用戶
        User user1 = userMapper.findUserById(1);
        System.out.println(user1);
        
        //更新user1的信息,清空一級緩存
        user1.setUsername("王五");
        userMapper.updateUser(user1);
        //執(zhí)行commit操作才會情況緩存
        sqlSession.commit();
        
        //第二次發(fā)起請求纤掸,查詢id為1的用戶
        User user2 = userMapper.findUserById(1);
        System.out.println(user1);
        sqlSession.close();
    }

此時的查詢結(jié)果為:

2

這里我們發(fā)現(xiàn)在第二次查詢的時候也是發(fā)出了sql語句脐供,因為緩存已經(jīng)被清空了。

2.3 應(yīng)用

在正式開發(fā)中借跪,mybatis會和spring進(jìn)行整合開發(fā)政己,事務(wù)控制是在service上面,一個service類的方法中包括很多mapper方法的調(diào)用掏愁,如:

service{
  //1.開始執(zhí)行時歇由,開啟事務(wù),創(chuàng)建SqlSession對象
  //2.第一次調(diào)用mapper方法findUserById(1)
  //....
  //3.第二次調(diào)用mapper方法findUserById(1)果港,此時從緩存中取
  //4.方法結(jié)束沦泌,SqlSession關(guān)閉

}

注意:這里我們可以看到事務(wù)關(guān)閉是在service方法執(zhí)行完之后,而不是像上面測試那樣查詢完了就關(guān)閉了辛掠,這樣就可以利用一級緩存谢谦。當(dāng)然如果是兩個service方法則不能實現(xiàn)了,如果還想實現(xiàn)緩存則需要用到二級緩存了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末他宛,一起剝皮案震驚了整個濱河市船侧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌厅各,老刑警劉巖镜撩,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異队塘,居然都是意外死亡袁梗,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門憔古,熙熙樓的掌柜王于貴愁眉苦臉地迎上來遮怜,“玉大人,你說我怎么就攤上這事鸿市【饬海” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵焰情,是天一觀的道長陌凳。 經(jīng)常有香客問我,道長内舟,這世上最難降的妖魔是什么合敦? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮验游,結(jié)果婚禮上充岛,老公的妹妹穿的比我還像新娘。我一直安慰自己耕蝉,他們只是感情好崔梗,可當(dāng)我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著赔硫,像睡著了一般炒俱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上爪膊,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天,我揣著相機(jī)與錄音砸王,去河邊找鬼推盛。 笑死,一個胖子當(dāng)著我的面吹牛谦铃,可吹牛的內(nèi)容都是我干的耘成。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼瘪菌!你這毒婦竟也來了撒会?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤师妙,失蹤者是張志新(化名)和其女友劉穎诵肛,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體默穴,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡怔檩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蓄诽。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片薛训。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖仑氛,靈堂內(nèi)的尸體忽然破棺而出乙埃,到底是詐尸還是另有隱情,我是刑警寧澤锯岖,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布膊爪,位于F島的核電站,受9級特大地震影響嚎莉,放射性物質(zhì)發(fā)生泄漏米酬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一趋箩、第九天 我趴在偏房一處隱蔽的房頂上張望赃额。 院中可真熱鬧,春花似錦叫确、人聲如沸跳芳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽飞盆。三九已至,卻和暖如春次乓,著一層夾襖步出監(jiān)牢的瞬間吓歇,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工票腰, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留城看,地道東北人。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓杏慰,卻偏偏與公主長得像测柠,于是被迫代替她去往敵國和親炼鞠。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,786評論 2 345

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