面试官:说一下 MyBatis 缓存机制?

MyBatis 的缓存机制属于本地缓存,适用于单机系统,它的作用是减少数据库的查询次数,提高系统性能。

MyBaits 中包含两级本地缓存:

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

一级缓存 VS 二级缓存

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

  1. 一级缓存是 SqlSession 级别的缓存,它的作用域是同一个 SqlSession,同一个 SqlSession 中的多次查询会共享同一个缓存。二级缓存是 Mapper 级别的缓存,它的作用域是同一个 Mapper,同一个 Mapper 中的多次查询会共享同一个缓存。
  2. 一级缓存是默认开启的,不需要手动配置。二级缓存需要手动配置,需要在 Mapper.xml 文件中添加 标签。
  3. 一级缓存的生命周期是和 SqlSession 一样长的,当 SqlSession 关闭时,一级缓存也会被清空。二级缓存的生命周期是和 MapperFactory 一样长的,当应用程序关闭时,二级缓存也会被清空。
  4. 一级缓存只能用于同一个 SqlSession 中的多次查询,不能用于跨 SqlSession 的查询。二级缓存可以用于跨 SqlSession 的查询,多个 SqlSession 可以共享同一个二级缓存。
  5. 一级缓存是线程私有的,不同的 SqlSession 之间的缓存数据不会互相干扰。二级缓存是线程共享的,多个 SqlSession 可以共享同一个二级缓存,需要考虑线程安全问题。

开启二级缓存

MyBatis 一级缓存是自带的缓存,默认开启,且无法关闭。而二级缓存默认是关闭的,因此我们只需要掌握二级缓存的开启即可。 二级缓存开启需要两步:

  1. 在 mapper xml 中添加 标签。
  2. 在需要缓存的标签上设置 useCache="true"(最新版本中,可以省略此步骤)。

完整示例实现如下:

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mybatis.demo.mapper.StudentMapper">
    <cache/>
    <select id="getStudentCount" resultType="Integer" useCache="true">
        select count(*) from student
    </select>
</mapper>

编写单元测试代码:

java 复制代码
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class StudentMapperTest {
    @Autowired
    private StudentMapper studentMapper;

    @Test
    void getStudentCount() {
        int count = studentMapper.getStudentCount();
        System.out.println("查询结果:" + count);
        int count2 = studentMapper.getStudentCount();
        System.out.println("查询结果2:" + count2);
    }
}

执行以上单元测试的执行结果如下: 从以上结果可以看出,两次查询虽然使用了不同的 SqlSession,但第二次查询使用了缓存,并未查询数据库。

小结

MyBatis 的缓存机制属于本地缓存,适用于单机系统,它的作用是减少数据库的查询次数,提高系统性能。MyBatis 本地缓存有两类:一级缓存 SqlSession 级别,默认开启不能关闭,二级缓存 Mapper 级别,默认关闭,可以通过在 XML 中添加 标签开启。

本文已收录到我的面试小站 www.javacn.site,其中包含的内容有:Redis、JVM、并发、并发、MySQL、Spring、Spring MVC、Spring Boot、Spring Cloud、MyBatis、设计模式、消息队列等模块。

相关推荐
想不明白的过度思考者1 天前
Spring Boot 配置文件深度解析
java·spring boot·后端
第二只羽毛1 天前
Java图书管理系统的设计与实现
java·大数据·安全·系统安全
敲敲了个代码1 天前
从硬编码到 Schema 推断:前端表单开发的工程化转型
前端·javascript·vue.js·学习·面试·职场和发展·前端框架
cike_y1 天前
Mybatis之解析配置优化
java·开发语言·tomcat·mybatis·安全开发
WanderInk1 天前
刷新后点赞全变 0?别急着怪 Redis,这八成是 Long 被 JavaScript 偷偷“改号”了(一次线上复盘)
后端
是一个Bug1 天前
Java基础50道经典面试题(四)
java·windows·python
Slow菜鸟1 天前
Java基础架构设计(三)| 通用响应与异常处理(分布式应用通用方案)
java·开发语言
吴佳浩1 天前
Python入门指南(七) - YOLO检测API进阶实战
人工智能·后端·python
我是Superman丶1 天前
《Spring WebFlux 实战:基于 SSE 实现多类型事件流(支持聊天消息、元数据与控制指令混合传输)》
java
廋到被风吹走1 天前
【Spring】常用注解分类整理
java·后端·spring