关于java:面试官说一下-MyBatis-缓存机制

7次阅读

共计 2001 个字符,预计需要花费 6 分钟才能阅读完成。

MyBatis 的缓存机制属于本地缓存,实用于单机零碎,它的作用是缩小数据库的查问次数,进步零碎性能。

MyBaits 中蕴含两级本地缓存:

  1. 一级缓存 :SqlSession 级别的,是 MyBatis 自带的缓存性能,默认开启,并且无奈敞开,因而当有两个 SqlSession 拜访雷同的 SQL 时,一级缓存也不会失效,须要查问两次数据库。
  2. 二级缓存 :Mapper 级别的,只有是同一个 Mapper,无论应用多少个 SqlSession 来操作,数据都是共享的,多个不同的 SqlSession 能够共用二级缓存,MyBatis 二级缓存默认是敞开的,须要应用时可手动开启,二级缓存也能够应用第三方的缓存,比方,应用 Ehcache 作为二级缓存。

    一级缓存 VS 二级缓存

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

  3. 一级缓存是 SqlSession 级别的缓存,它的作用域是同一个 SqlSession,同一个 SqlSession 中的屡次查问会共享同一个缓存。二级缓存是 Mapper 级别的缓存,它的作用域是同一个 Mapper,同一个 Mapper 中的屡次查问会共享同一个缓存。
  4. 一级缓存是默认开启的,不须要手动配置。二级缓存须要手动配置,须要在 Mapper.xml 文件中增加 <cache> 标签。
  5. 一级缓存的生命周期是和 SqlSession 一样长的,当 SqlSession 敞开时,一级缓存也会被清空。二级缓存的生命周期是和 MapperFactory 一样长的,当应用程序敞开时,二级缓存也会被清空。
  6. 一级缓存只能用于同一个 SqlSession 中的屡次查问,不能用于跨 SqlSession 的查问。二级缓存能够用于跨 SqlSession 的查问,多个 SqlSession 能够共享同一个二级缓存。
  7. 一级缓存是线程公有的,不同的 SqlSession 之间的缓存数据不会相互烦扰。二级缓存是线程共享的,多个 SqlSession 能够共享同一个二级缓存,须要思考线程平安问题。

    开启二级缓存

    MyBatis 一级缓存是自带的缓存,默认开启,且无奈敞开。而二级缓存默认是敞开的,因而咱们只须要把握二级缓存的开启即可。
    二级缓存开启须要两步:

  8. 在 mapper xml 中增加 <cache> 标签。
  9. 在须要缓存的标签上设置 useCache=”true”(最新版本中,能够省略此步骤)。

残缺示例实现如下:

<?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>

编写单元测试代码:

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 中增加 <cache> 标签开启。

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

正文完
 0