mybatis二級緩存原理及測試

.1 mybatis二級緩存

1.1 二級緩存原理

Paste_Image.png

1.2.首先開啟mybatis二級緩存

sqlSession1去查詢用戶ID為1的用戶信息,查詢到的用戶信息會將查詢數(shù)據(jù)存儲到二級緩存中
如果sqlSession3去執(zhí)行相同的mapper下sql 執(zhí)行commit提交,就會清空mapper下的二級緩存區(qū)域
sqlSession2去查詢用戶ID為1的用戶信息,去緩存中找是否存在數(shù)據(jù),如果存在直接從緩存中取出數(shù)據(jù)

1.2.1二級緩存與一級緩存的區(qū)別:
1.二級緩存的范圍更大多個sqlSession可以共享一個userMapper的二級緩存區(qū)域 (按照namespace分)
2. userMapper有一個二級緩存區(qū)域,其他Mapper也有自己的二級緩存區(qū)域
3.每一個namespace的Mapper有一個二級緩存區(qū)域
4.如果兩個mapper的namespace相同,這兩個mapper執(zhí)行的sql查詢到的數(shù)據(jù)將存在相同的二級緩存區(qū)域中

1.3開啟二級緩存:

mybatis的二級緩存是mapper范圍級別,除了在sqlMapperConfig.xml中開啟二級緩存的總開關,還要在具體的mapper.xml中來開啟二級緩存
在核心配置文件sqlMapConfig.xml中加入:

<setting name="cacheEnabled" value="true"/>

在userMapper.xml中開啟二級緩存,userMapper.xml下的sql執(zhí)行完后會將數(shù)據(jù)存在他的二級緩存中,如下:

Paste_Image.png

2.調用的pojo類需要實現(xiàn)序列化接口:

實現(xiàn)序列化是為了反序列化,將來的緩存數(shù)據(jù)不一定是存在內存中,可能存在硬盤,遠程等等下,可以將數(shù)據(jù)取出進行反序列化:

Paste_Image.png

2.3 測試代碼:


    /**
     * 二級緩存測試
     */
    @Test
    public void cache2() {
        try {
            SqlSession sqlSession1 = SqlSessionFactory.openSession();
            SqlSession sqlSession2 = SqlSessionFactory.openSession();
            SqlSession sqlSession3 = SqlSessionFactory.openSession();
            // 第一次查詢
            UsersMapper usersMapper1 = sqlSession1.getMapper(UsersMapper.class);
            Users user1 = usersMapper1.findUsersById(1);
            System.out.println(user1);
            //執(zhí)行關閉,才能將sqlsession中的數(shù)據(jù)存入二級緩存區(qū)域
            sqlSession1.close();

            // 第二次查詢
            UsersMapper usersMapper2 = sqlSession2.getMapper(UsersMapper.class);
            Users user2 = usersMapper2.findUsersById(1);
            System.out.println(user2);
            sqlSession2.close();

            // 第三次查詢
            UsersMapper usersMapper3 = sqlSession3.getMapper(UsersMapper.class);
            Users user3 = usersMapper3.findUsersById(1);
            System.out.println(user3);
            sqlSession3.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

2.4 運行測試類:

Paste_Image.png

由上圖可見,只觸發(fā)了一次sql語句
下面進行中間提交操作,修改用戶信息

Paste_Image.png

執(zhí)行如下:

Paste_Image.png

所以.二級緩存執(zhí)行提交操作時候,會清空緩存,避免臟數(shù)據(jù).

2.5 userCache禁用二級緩存

在statement中設置useCache=false ,可以禁用當前select語句的二級緩存,即每次查詢都會發(fā)出sql去查詢,默認情況下是TRUE,即該sql使用二級緩存,

Paste_Image.png

總結:針對每次查詢都需要最新數(shù)據(jù)的sql,要設置成userCache= false

2.5 刷新緩存(清空緩存)

并不是再把數(shù)據(jù)哭的最新數(shù)據(jù)拿出來把它倒騰到緩存當中,沒有這一出,mybatis刷新緩存就是清空緩存,一般情況下,一般情況下執(zhí)行commit操作都需要刷新緩存,Cache=TRUE表示刷新緩存,可以避免數(shù)據(jù)庫的臟讀,默認為true

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容