一:mybatis的二级缓存介绍
1、一级缓存默认开启,缓存范围SqlSession会话,存储时间是非常端的使用率不高。
2、二级缓存手动开启,缓存属于范围Mapper Namespace
3、两个缓存的范围图解
二:二级缓存的运行规则和开启
1、二级缓存开启后默认所有查询操作均使用缓存
在mapper/goods.xml中开启:
<!--开启二级缓存-->
<cache eviction="LRU" flushInterval="60000" size="512" readOnly="true"/>
eviction是缓存的清除策略,当缓存对象数量达到上限后,自动触发对应算法对缓存对象清除
1.LRU - 最近最久未使用:移除最长时间不被使用的对象【保证命中率,最常使用】
对象数量: O1 O2 O3 O4 .... O512
访问间隔时间:14 88 63 1 666
2.FIFO - 先进先出:按对象进入缓存的顺序来移除它们【无法保证命中率】
3.SOFT - 软引用:移除基于垃圾收集器状态和软引用规则的对象
4.WEAK - 弱引用:更积极的移除基于垃圾收集器状态和弱引用规则的对象。
flushInterval:代表间隔多长时间自动清空缓存,单位毫秒,600000毫秒=10分钟
size:缓存存储上限,用于保存对象或集合(1个集合算1个对象)的数量上限
readOnly:设置为true,代表返回只读缓存,每次从缓存取出的是缓存对象本身,这种执行效率较高
设置为false,代表每次取出的缓存对象的 "副本",每次取出的对象都是不同的,这种安全性较高
2、(一级和二级缓存)写操作commit提交时对该namespace缓存强制清空。测试用例:
/**
* 测试一级缓存
*/
@Test
public void testLv1Cache() throws Exception{
SqlSession sqlSession = null;
try{
sqlSession = MybatisUtils.openSession();
//执行两次,控制台只打印一次sql语句
Goods goods = sqlSession.selectOne("goods.selectById", 24);
Goods goods2 = sqlSession.selectOne("goods.selectById", 24);
//同一个SqlSession会话,指向同一个缓存区域
System.out.println(goods.hashCode()+"--"+goods2.hashCode());
}catch (Exception e){
throw e;
}finally {
MybatisUtils.closeSession(sqlSession);
}
try{
sqlSession = MybatisUtils.openSession();
//执行两次,控制台只打印一次sql语句
Goods goods = sqlSession.selectOne("goods.selectById", 24);
sqlSession.commit();//commit会把当前的namespace缓存强制清空
Goods goods2 = sqlSession.selectOne("goods.selectById", 24);
//同一个SqlSession会话,指向同一个缓存区域
System.out.println(goods.hashCode()+"--"+goods2.hashCode());
}catch