MyBatis的缓存

257 阅读3分钟

1、缓存是什么:

  • 存储在内存中的一些临时数据。
  • 对于一些经常需要查询的数据放在内存中,当用户去查询数据时就不用从磁盘上(mysql等关系型数据库中)查询,从缓存中查询可以提高查询效率,从而解决高并发系统的性能问题。

2、使用缓存的好处:

  • 可以减少和数据库的交互次数,减少系统开销,提高系统的效率。

3、什么情况下使用缓存:

  • 对于一些经常查询并且不会经常改变的数据。

Mybatis缓存

  • MyBatis中包含一个强大的查询缓存特性,能很方便地定制和配置缓存。缓存可以极大的提升查询效率。

  • MyBatis系统中默认定义了两级缓存:一级缓存二级缓存

  • 1)默认情况下,只有一级缓存开启。(SqlSession级别的缓存,即本地缓存);

    2)二级缓存则需要手动开启和配置,二级缓存是基于namespace级别的缓存;

    3)为了提高扩展性,MyBatis定义了缓存接口Cache。我们可以通过实现Cache接口来进行自定义二级缓存。

Mybatis一级缓存

一级缓存也叫本地缓存:

  • 当头一次进行数据查询时,会先去一级缓存中查看有没有数据,如果没有就去数据库中查询,然后将查询到的数据返回,并且存储在缓存中,以后如果需要获取相同的数据,直接从缓存中拿,不用再去查询数据库;

一级缓存失效的情况:

一级缓存是SqlSession级别的缓存,是一直开启的,我们关闭不了它;

当然在我们使用的过程中也会有些情况导致查询数据不会去一级缓存中去取,还是要去db层做查询。

  • 每个sqlSession中的缓存相互独立;
  • sqlSession相同,查询条件不同。因为缓存条件不同,缓存中还没有数据;
  • sqlSession相同,在两次相同查询条件中间执行过增删改操作。(因为中间的增删改可能对缓存中数据进行修改,所以不能用);
  • sqlSession相同,手动清空了一级缓存。

Mybatis二级缓存

  • 二级缓存也叫全局缓存,一级缓存作用域太低了,所以诞生了二级缓存
  • 基于namespace级别的缓存,一个名称空间,对应一个二级缓存;
  • 工作机制:
    1. 一个会话查询一条数据,这个数据就会被放在当前会话的一级缓存中;
    2. 如果当前会话关闭了,这个会话对应的一级缓存就没了;但是我们想要的是,会话关闭了,一级缓存中的数据被保存到二级缓存中;
    3. 新的会话查询信息,就可以从二级缓存中获取内容;
    4. 不同的mapper查出的数据会放在自己对应的缓存(map)中;

只要开启了二级缓存,我们在同一个Mapper中的查询,可以在二级缓存中拿到数据,查询到的数据会默认先放在一级缓存中,只有当会话提交或者关闭以后,一级缓存中的数据才会转到二级缓存中。

Mybatis缓存原理图

image.png