前言
在学习mybatis学习中认识了缓存机制,它可以提高数据的存储效率,但是缓存也存在一些不足之处,所以,在使用缓存的时候需要我们对缓存有足够的了解,能够在合适的位置设置缓存,提高代码的运行效率。
一、什么是缓存
缓存(cache),数据交换的缓冲区,当应用程序需要读取数据时,先从数据库中将数据取出,放置在缓冲区中,应用程序从缓冲区读取数据。
特点:数据库取出的数据保存在内存中,具备快速读取和使用。
限制:读取时无需再从数据库获取,数据可能不是最新的;
缓存的术语:
命中:需要的数据在缓冲区中找到,
未命中:需要的数据在缓冲区中未找到
既然缓存有一些缺陷,因此,我们就应该,了解缓冲的使用场景,从缓存的特点就可以分析出 ,
适合使用缓存:
经常查询并且不经常改变的
数据的正确与否对最终结果影响不大的
比如:一个公司的介绍,新闻等不适合用于缓存:
经常改变的数据
数据的正确与否对最终结果影响很大
比如商品的库存,股市的牌价等
二、一级缓存
一级缓存属于mybatis中会话 session 级别的缓存,针对一次会话操作内;同一次会话期间只要查询过的数据都会保存在当前SqlSessiion的一个Map中
一级缓存失效的四种情况:
1.当调用sqlsession的修改,添加,删除操作后,调用commit(),close() 等方法时就会清空一级缓存。
2.不同的SqlSession对应不同的一级缓存
3.同一个SqlSession但是查询条件不同
4.同一个SqlSession两次查询期间手动清空了缓存
public class Demo01 {
public static void main(String[] args) {
SqlSession sqlSession = DaoUtil.getSqlSession();
studentmapper mapper = sqlSession.getMapper(studentmapper.class);
Student student = mapper.findStudentBySid(1);
System.out.println(student);
System.out.println("=======================================");
SqlSession sqlSession2 = DaoUtil.getSqlSession();
studentmapper mapper2 = sqlSession2.getMapper(studentmapper.class);
Student student2 = mapper2.findStudentBySid(1);
System.out.println(student2);
DaoUtil.closeAllResource(sqlSession);
}
}
运行结果:
可以看到不同的SqlSession对象会导致一级缓存失效
可以看到执行提交或者回滚事务后都会造成缓存清除
一级缓存的配置
<setting name="localCacheScope" value="SESSION"/>
localCacheScope : 表示配置一级缓存
SESSION
默认是 session 级别的缓存;
STATEMENT
statement 级别的缓存。
一级缓存的工作流程
- 对于某个 Select Statement,根据该 Statement 生成 key;
- 判断在Local Cache中,该key是否用对应的数据存在;
- 如果命中,则跳过查询数据库,继续往下走;
- 如果没命中,去数据库中查询数据,得到查询结果;
- 将key和查询到的结果作为 key 和value,放入Local Cache 中;
- 将查询结果返回;
- 判断缓存级别是否为 STATEMENT级别,如果是的话,清空本地缓存
三、二级缓存
2.1.二级缓存—mapper.xml
配置步骤:
1.在mybatis的sqlMapConfig.xml 中配置
2.在mybatis的sqlmap中配置(mapper.xml中配置)
3.在使用的操作中配置(在select标签中配置)
2.2.二级缓存—注解
配置步骤:
1.在mybatis的sqlMapConfig.xml 中配置
2.在接口的定义上面直接使用@CacheNamespace 并将blocking设置为true,二级缓存就可以使用了
二级缓存:
- Mybatis 的二级缓存相对于一级缓存来说,实现了缓存数据的共享,可控性也更强;
- 极大可能会出现错误数据,有设计上的缺陷,安全使用的条件比较苛刻;
- 分布式环境下,必然会出现读取到错误数据,所以不推荐使用。
区别小结:
一级缓存 Mybatis的一级缓存是指SQLSession,一级缓存的作用域是SQlSession, Mabits默认开启一级缓存。 在同一个SqlSession中,执行相同的SQL查询时;第一次会去查询数据库,并写在缓存中,第二次会直接从缓存中取。 当执行SQL时候两次查询中间发生了增删改的操作,则SQLSession的缓存会被清空。 每次查询会先去缓存中找,如果找不到,再去数据库查询,然后把结果写到缓存中。
二级缓存 二级缓存是mapper级别的,Mybatis默认是没有开启二级缓存的。 第一次调用mapper下的SQL去查询用户的信息,查询到的信息会存放代该mapper对应的二级缓存区域。 第二次调用namespace下的mapper映射文件中,相同的sql去查询用户信息,会去对应的二级缓存内取结果。