日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

mybatis一级,二级缓存。缓存带来的脏读问题

發布時間:2023/12/10 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mybatis一级,二级缓存。缓存带来的脏读问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

title

    • 1. 關于緩存的介紹
    • 2. 一級緩存,默認開啟,session級別
    • 3. 二級緩存,mapper 的namespace級別


1. 關于緩存的介紹

Mybatis一級緩存的作用域是同一個SqlSession,在同一個sqlSession中兩次執行相同的sql語句,第一次執行完
畢會將數據庫中查詢到的數據寫到緩存(內存),第二次會從緩存中獲取數據將不再從數據庫查詢,從而提
高查詢效率。當一個sqlSession結束后該sqlSession中的一級緩存也就不存在了。Mybatis默認開啟一級緩存。
Mybatis二級緩存是多個SqlSession共享的,其作用域是mapper的同一個namespace,不同的sqlSession兩次執行
相同namespace下的sql語句且向sql中傳遞參數也相同即最終執行相同的sql語句,第一次執行完畢會將數據庫
中查詢的數據寫到緩存(內存),第二次會從緩存中獲取數據將不再從數據庫查詢,從而提高查詢效
率。Mybatis默認沒有開啟二級緩存需要在setting全局參數中配置開啟二級緩存。
如果二級緩存沒有取到,再從一級緩存中找,如果一級緩存也沒有,從數據庫查詢。


2. 一級緩存,默認開啟,session級別

一級緩存的清空:

1、關于一級緩存的清空 一級緩存區域是根據SqlSession為單位劃分的。 每次查詢會先從緩存區域找, 如果找不到從數據庫查詢,查詢 到數據將數據寫入緩存。 Mybatis內部存儲緩存使用一個HashMap, Key為hashCode+sqlId+sql語句。value為從查 詢出來映射生成的Java對象。 sqlSession執行insert、update、delete等操作commit提交后會清空緩存區域。

一級緩存測試:

// 一級緩存默認開啟,二級緩存的開啟需要配置// 一級緩存的作用域:當前session@Testpublic void test1() {StuInfoMapper stuMapper = sqlSession.getMapper(StuInfoMapper.class);StuInfo stu = stuMapper.getStuInfoById(1);System.out.println(stu);// 這里是讀取的緩存里面的stuStuInfo stu1 = stuMapper.getStuInfoById(1);System.out.println(stu1);}

只查詢一次


臟讀問題

簡單的說:基于mybatis中的緩存機制,查詢的結果是緩存中的結果,數據未得到即時更新。

// 緩存帶來的臟讀問題// 這里不開啟二級緩存@Testpublic void test2() {// 第一個sessionSqlSession sqlSession1 = sqlSessionFactory.openSession();StuInfoMapper stuInfoMapper1 = sqlSession1.getMapper(StuInfoMapper.class);StuInfo stu1 = stuInfoMapper1.getStuInfoById(1);System.out.println(stu1);// 第二個sessionSqlSession sqlSession2 = sqlSessionFactory.openSession();StuInfoMapper stuInfoMapper2 = sqlSession2.getMapper(StuInfoMapper.class);StuInfo stu2 = stuInfoMapper2.getStuInfoById(1);System.out.println(stu2);// 實現commit 修改操作 清空session1, 重新查詢stuInfoMapper1.updateStuInfoById(new StuInfo(1, "jack-->小李子",null, null, null));sqlSession1.commit();System.out.println("=============== after update... ================");stu1 = stuInfoMapper1.getStuInfoById(1);System.out.println("commit session1 重新查詢.. " + stu1);stu2 = stuInfoMapper2.getStuInfoById(1);System.out.println("一級緩存中的stu2, 臟讀... " + stu2);}

3. 二級緩存,mapper 的namespace級別

啟用緩存


當前mapper 啟用二級緩存


測試:

// 二級緩存在所有session之間共享。@Testpublic void test1() {// session1StuInfoMapper stuInfoMapper1 = sqlSession.getMapper(StuInfoMapper.class);StuInfo stu1 = stuInfoMapper1.getStuInfoById(1);// session1 關閉, 緩存到二級緩存中sqlSession.close();System.out.println(stu1);// 先讀二級緩存,不會查詢數據庫SqlSession sqlSession2 = sqlSessionFactory.openSession();StuInfoMapper stuInfoMapper2 = sqlSession2.getMapper(StuInfoMapper.class);StuInfo stu2 = stuInfoMapper2.getStuInfoById(1);System.out.println(stu2);}

總結

以上是生活随笔為你收集整理的mybatis一级,二级缓存。缓存带来的脏读问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。