.1 mybatis二級緩存
1.1 二級緩存原理
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中開啟二級緩存的總開關(guān),還要在具體的mapper.xml中來開啟二級緩存
在核心配置文件sqlMapConfig.xml中加入:
<setting name="cacheEnabled" value="true"/>
在userMapper.xml中開啟二級緩存,userMapper.xml下的sql執(zhí)行完后會將數(shù)據(jù)存在他的二級緩存中,如下:
2.調(diào)用的pojo類需要實現(xiàn)序列化接口:
實現(xiàn)序列化是為了反序列化,將來的緩存數(shù)據(jù)不一定是存在內(nèi)存中,可能存在硬盤,遠程等等下,可以將數(shù)據(jù)取出進行反序列化:
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í)行關(guān)閉,才能將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 運行測試類:
由上圖可見,只觸發(fā)了一次sql語句
下面進行中間提交操作,修改用戶信息
執(zhí)行如下:
所以.二級緩存執(zhí)行提交操作時候,會清空緩存,避免臟數(shù)據(jù).
2.5 userCache禁用二級緩存
在statement中設(shè)置useCache=false ,可以禁用當(dāng)前select語句的二級緩存,即每次查詢都會發(fā)出sql去查詢,默認情況下是TRUE,即該sql使用二級緩存,
總結(jié):針對每次查詢都需要最新數(shù)據(jù)的sql,要設(shè)置成userCache= false
2.5 刷新緩存(清空緩存)
并不是再把數(shù)據(jù)哭的最新數(shù)據(jù)拿出來把它倒騰到緩存當(dāng)中,沒有這一出,mybatis刷新緩存就是清空緩存,一般情況下,一般情況下執(zhí)行commit操作都需要刷新緩存,Cache=TRUE表示刷新緩存,可以避免數(shù)據(jù)庫的臟讀,默認為true