一级缓存:SqlSession 级别 二级缓存:Mapper 级别

MyBatis 二级缓存是 MyBatis 中非常重要的一个特性,它的作用是减少数据库的查询次数,提高系统性能。

二级缓存包含两级缓存:一级缓存和二级缓存。

  1. 一级缓存是 SqlSession 级别的,是 MyBatis 自带的缓存功能,并且无法关闭,因此当有两个 SqlSession 访问相同的 SQL 时,一级缓存也不会生效,需要查询两次数据库;
  2. 二级缓存是 Mapper 级别的,只要是同一个 Mapper,无论使用多少个 SqlSession 来操作,数据都是共享的,多个不同的 SqlSession 可以共用二级缓存,MyBatis 二级缓存默认是关闭的,需要使用时可手动开启,二级缓存也可以使用第三方的缓存,比如,使用 Ehcache 作为二级缓存。

一级缓存 VS 二级缓存

一级缓存和二级缓存的区别如下:

  1. 一级缓存是 SqlSession 级别的缓存,它的作用域是同一个 SqlSssion,同一个 SqlSession 中的多次查询会共享同一个缓存。二级缓存是 Mapper 级别的缓存,它的作用域是同一个 Mapper,同一个 Mapper 中的多次查询会共享同一个缓存。
  2. 一级缓存是默认开启的,不需要手动配置。二级缓存需要手动配置,需要在 Mapper.xml 文件中添加 <cache> 标签。
  3. 一个缓存只能用于同一个 SqlSession 中的多次查询,不能用于跨 SqlSession 的查询。二级缓存可以用于跨 SqlSession 的查询,多个 SqlSession 可以共享同一个二级缓存。
  4. 一级缓存是线程私有的,不同的 SqlSession 之间的缓存数据不会互相干扰。二级缓存是线程共享的,多个 SqlSession 可以共享同一个二级缓存,需要考虑线程安全问题。

开启二级缓存

二级缓存默认是不开启的,我们需要手动开启二级缓存。 二级缓存开启需要两步: