mybatis-notes:關于mybatis的一二級緩存

1. 一級緩存和二級緩存

  • 在mybatis中依痊,為了節(jié)省資源,會將之前查詢的數據緩存到SqlSession的對象中(一級緩存)怎披;
    當再次查詢的時候胸嘁,現在緩存中查詢是否有相同的sql語句,如果有相同的語句钳枕,那么就直接從緩存中讀出數據缴渊。
  • 一級緩存有個不足的地方就是,在一個項目中鱼炒,不可能只有一個SqlSession,會有多個SqlSession存在衔沼;
    當多個SqlSession訪問一個mapper的一個查詢操作,并且sql語句相同時昔瞧,那么每個SqlSession都會在數據庫中查詢一次指蚁,就比較消耗資源了;
    所以二級緩存就來了自晰,二級緩存是基于mapper的凝化,當有SqlSession來調用mapper時,會在SqlSessionFactory緩存中查找與mapper名空間對應的緩存區(qū)酬荞,查看緩存中是否有這個SqlSession要使用的sql語句相同的搓劫,如果有就直接從緩存中讀取瞧哟。
  • 但是一級緩存和二級緩存在執(zhí)行了commit操作后,也就是增刪改的提交操作后枪向,會將緩存刷新勤揩;
    當一個SqlSession被關閉后秘蛔,才會將這個SqlSession的一級緩存刷入二級緩存中。

2. 一級緩存的案例

因為一級緩存是默認的深员,我們只需要在mybatis中用同一條sql兩次查詢,就可以通過跟進日志了解一級緩存的執(zhí)行信息倦畅。
下面是測試的部分代碼遮糖,即用同一條sql執(zhí)行兩次查詢,用不同的對象名來獲取返回值:

        //綁定
        TeacherDao td = sqlSession.getMapper(TeacherDao.class);
        
        //一級緩存滔迈,基于mapper
        Teacher t= td.findTeacherByTname("htc");
        System.out.println("t:"+t);
        Teacher tt = td.findTeacherByTname("htc");
        System.out.println("tt:"+tt);

控制臺打印信息:

Created connection 559670971.
==>  Preparing: select t.t_id t_id,t.t_name t_name from teacher t where t.t_name =? 
==> Parameters: htc(String)
<==    Columns: t_id, t_name
<==        Row: 1, htc
<==      Total: 1
Cache Hit Ratio [demo.cyj.dao.TeacherDao]: 0.0
==>  Preparing: select s.id id,s.stu_name stu_name,s.stu_age age,s.t_id t_id from student s left join teacher t on t.t_id = s.t_id where t.t_name=? 
==> Parameters: htc(String)
<==    Columns: id, stu_name, age, t_id
<==        Row: 8, 黑拐, 43, 1
<==        Row: 9, 拐, 50, 1
<==        Row: 10, 拐棍, 50, 1
<==        Row: 11, 大黑拐, 30, 1
<==        Row: 12, 小黑拐, 12, 1
<==        Row: 13, 拐哥, 29, 1
<==        Row: 14, 胡黑拐, 123, 1
<==      Total: 7
t:demo.cyj.pojo.Teacher_$$_jvst65e_0@5ae63ade
Cache Hit Ratio [demo.cyj.dao.TeacherDao]: 0.0
tt:demo.cyj.pojo.Teacher_$$_jvst65e_0@5ae63ade
  • 可以看到只創(chuàng)建了一次connection燎悍;
  • 并且只sql語句沒有重復(控制臺信息中之所以有兩條sql敬惦,是因為我在之前配置過懶加載,什么是懶加載谈山,為什么會有兩條sql俄删,可以點擊并參考這篇文章);
  • 對象 t 和 tt 打印出來的hashcode也都是5ae63ade畴椰,也就說他們是相同的存儲地址鸽粉,的確是從緩存里拿出來的

3. 二級緩存案例

一級緩存是默認開啟的,但二級緩存需要手動開啟触机,所以會稍微做一些配置。配置如下:
在mybatis的總配置文件config.xml中的<settings>下添加一句

    <settings>
        <!-- 開啟二級緩存 -->
        <setting name="cacheEnabled" value="true"></setting>
    </settings>

然后在需要用到二級緩存的mapper文件下的<mapper>標簽下添加一句
<cache/>

<cache><cache/>

還有一個初次接觸這個的人容易踩的一個坑就是片任,每個用到二級緩存的類都要序列化一次,也就是要實現serializable接口对供, 點擊查看這個坑長什么樣氛濒,建議不管用不用序列化鹅髓,也將每個實體類都序列化了京景。

好了,配置做完了醋粟,就是測試了:

public class Test {
    
    public static void main(String[] args) throws IOException {
        String src = "config.xml";
        InputStream inputStream = Resources.getResourceAsStream(src);
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //第一次查詢
        SqlSession sqlSession = sessionFactory.openSession(true);
        TeacherDao td = sqlSession.getMapper(TeacherDao.class);     
        Teacher t= td.findTeacherByTname("htc");
        System.out.println("t:"+t);
        sqlSession.close();
        
        //第二次查詢 
        SqlSession sqlSession2 = sessionFactory.openSession(true);
        TeacherDao td2 = sqlSession2.getMapper(TeacherDao.class);
        Teacher t2 = td2.findTeacherByTname("htc");
        System.out.println("t2:"+t2);
        sqlSession2.close();
    }
}

運行后重归,控制臺打印日志:

Created connection 559670971.
==>  Preparing: select t.t_id t_id,t.t_name t_name from teacher t where t.t_name =? 
==> Parameters: htc(String)
<==    Columns: t_id, t_name
<==        Row: 1, htc
<==      Total: 1
Cache Hit Ratio [demo.cyj.dao.TeacherDao]: 0.0
==>  Preparing: select s.id id,s.stu_name stu_name,s.stu_age age,s.t_id t_id from student s left join teacher t on t.t_id = s.t_id where t.t_name=? 
==> Parameters: htc(String)
<==    Columns: id, stu_name, age, t_id
<==        Row: 8, 黑拐, 43, 1
<==        Row: 9, 拐, 50, 1
<==        Row: 10, 拐棍, 50, 1
<==        Row: 11, 大黑拐, 30, 1
<==        Row: 12, 小黑拐, 12, 1
<==        Row: 13, 拐哥, 29, 1
<==        Row: 14, 胡黑拐, 123, 1
<==      Total: 7
t:demo.cyj.pojo.Teacher_$$_jvst65e_0@5ae63ade
Closing JDBC Connection [com.mysql.jdbc.Connection@215be6bb]
Returned connection 559670971 to pool.
Cache Hit Ratio [demo.cyj.dao.TeacherDao]: 0.3333333333333333
t2:demo.cyj.pojo.Teacher@26aa12dd
  • 可以看到只create了一次connection鼻吮,sql語句也沒有重復,(為什么有兩條sql參考 2.一級緩存 中的解釋)椎木,但是hashcode有變化應該是從sqlSession關閉后,將數據刷到二級緩存中導致的香椎,但是也的確只做了一次查詢。

總結

mybatis中關于一二級緩存的代碼已經封裝的很好了馍惹,我們要用的話需要做的并不多玛界,設置起來也很簡單,唯一的細節(jié)之處就是關于序列化的問題

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末良狈,一起剝皮案震驚了整個濱河市笨枯,隨后出現的幾起案子薪丁,更是在濱河造成了極大的恐慌猎醇,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件阻问,死亡現場離奇詭異沦疾,居然都是意外死亡第队,警方通過查閱死者的電腦和手機刨秆,發(fā)現死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來尸执,“玉大人缓醋,你說我怎么就攤上這事∷土唬” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵脆丁,是天一觀的道長动雹。 經常有香客問我,道長洽胶,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任丐怯,我火速辦了婚禮翔横,結果婚禮上,老公的妹妹穿的比我還像新娘禾唁。我一直安慰自己,他們只是感情好荡短,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布掘托。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪辱士。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天颂碘,我揣著相機與錄音椅挣,去河邊找鬼。 笑死切油,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播孕荠,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼稚伍,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了个曙?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤呼寸,失蹤者是張志新(化名)和其女友劉穎猴贰,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體米绕,經...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年迈套,在試婚紗的時候發(fā)現自己被綠了碱鳞。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡芙扎,死狀恐怖,靈堂內的尸體忽然破棺而出戒洼,到底是詐尸還是另有隱情,我是刑警寧澤圈浇,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布磷蜀,位于F島的核電站召耘,受9級特大地震影響褐隆,放射性物質發(fā)生泄漏。R本人自食惡果不足惜庶弃,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一歇攻、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧缴守,春花似錦、人聲如沸屡穗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽箍镜。三九已至,卻和暖如春色迂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背歇僧。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工锋拖, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留祸轮,地道東北人。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓柄错,卻偏偏與公主長得像苦酱,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子疫萤,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內容