Mybatis一级缓存、二级缓存介绍及工作原理

Mybatis一级缓存、二级缓存介绍及工作原理_第1张图片

如上图示:是一级缓存和二级缓存的关系

一级缓存是 sqlSession 级别的,在操作数据库时需要构造 sqlSession 对象,在对象中有一个数据结构(HashMap)用于存储缓存数据。不同的sqlSession之间的缓存数据区域(HashMap)是互相不影响的。

二级缓存是mapper级别的,也就是说可以多个 sqlSession 去操作同一个 Mapper 的sql语句,多个sqlSession可以公用二级缓存

一级缓存工作原理

当一个sqlSession对象去查询一条记录的时候,一级缓存会将其缓存到其数据结构中,当再次去使用相同条件查询的时候就会直接从一级缓存中获取,而不会去数据库中查询。

Mybatis一级缓存、二级缓存介绍及工作原理_第2张图片
当当前sqlSession对象执行了 commit(dedlete、update、insert)操作,一级缓存就会被清空,此后在有数据查询就会在一级缓存中找不到,然后就会去查找数据库中的数据然后再次缓存在一级缓存中

Mybatis一级缓存、二级缓存介绍及工作原理_第3张图片

目前mybatis 默认开启的就是一级缓存

一级缓存的作用,能适当缓解数据库的压力

二级缓存工作原理

二级缓存 底层是 HashMap 架构

二级缓存的作用域只在mapper级别的,也就是说无论你有多少个sqlSession去访问这个mapper,都会从缓存中获取到已有的数据

mapper 对应的也就是 namespace,所以二级缓存是按照 namespace 进行区分的,如果两个 mapper 文件的 namespace 相同,那么这两个 mapper 中查出来的数据都会存在在这个 namespace 中

Mybatis一级缓存、二级缓存介绍及工作原理_第4张图片

配置二级缓存

在Mybatis的配置文件中加入

<settings>  
   <!--开启二级缓存-->  
    <setting name="cacheEnabled" value="true"/>  
</settings>

然后在具体的mapper文件中增加

在这里插入图片描述


最后将对应的POJO类开启序列化

二级缓存的使用场景:

  • 访问频繁且要求实时性不高(因为二级缓存可能涉及到关联mapper,一个mapper更新并不会影响另一个mapper)
  • 查询耗时,且实时性不高的SQL

二级缓存的缺点:

刷新信息就是全表刷新,只要有一个commit操作,整个缓存全部清空

你可能感兴趣的:(MyBatis学习笔记)