共计 2001 个字符,预计需要花费 6 分钟才能阅读完成。
MyBatis 的缓存机制属于本地缓存,实用于单机零碎,它的作用是缩小数据库的查问次数,进步零碎性能。
MyBaits 中蕴含两级本地缓存:
- 一级缓存 :SqlSession 级别的,是 MyBatis 自带的缓存性能,默认开启,并且无奈敞开,因而当有两个 SqlSession 拜访雷同的 SQL 时,一级缓存也不会失效,须要查问两次数据库。
-
二级缓存 :Mapper 级别的,只有是同一个 Mapper,无论应用多少个 SqlSession 来操作,数据都是共享的,多个不同的 SqlSession 能够共用二级缓存,MyBatis 二级缓存默认是敞开的,须要应用时可手动开启,二级缓存也能够应用第三方的缓存,比方,应用 Ehcache 作为二级缓存。
一级缓存 VS 二级缓存
一级缓存和二级缓存的次要区别如下:
- 一级缓存是 SqlSession 级别的缓存,它的作用域是同一个 SqlSession,同一个 SqlSession 中的屡次查问会共享同一个缓存。二级缓存是 Mapper 级别的缓存,它的作用域是同一个 Mapper,同一个 Mapper 中的屡次查问会共享同一个缓存。
- 一级缓存是默认开启的,不须要手动配置。二级缓存须要手动配置,须要在 Mapper.xml 文件中增加 <cache> 标签。
- 一级缓存的生命周期是和 SqlSession 一样长的,当 SqlSession 敞开时,一级缓存也会被清空。二级缓存的生命周期是和 MapperFactory 一样长的,当应用程序敞开时,二级缓存也会被清空。
- 一级缓存只能用于同一个 SqlSession 中的屡次查问,不能用于跨 SqlSession 的查问。二级缓存能够用于跨 SqlSession 的查问,多个 SqlSession 能够共享同一个二级缓存。
-
一级缓存是线程公有的,不同的 SqlSession 之间的缓存数据不会相互烦扰。二级缓存是线程共享的,多个 SqlSession 能够共享同一个二级缓存,须要思考线程平安问题。
开启二级缓存
MyBatis 一级缓存是自带的缓存,默认开启,且无奈敞开。而二级缓存默认是敞开的,因而咱们只须要把握二级缓存的开启即可。
二级缓存开启须要两步: - 在 mapper xml 中增加 <cache> 标签。
- 在须要缓存的标签上设置 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、设计模式、音讯队列等模块。