【坑】Spring Boot整合MyBatis,一级缓存失效

一、Spring Boot整合MyBatis,一级缓存失效

1.1、概述

MyBatis一级缓存的作用域是同一个SqlSession,在同一个SqlSession中执行两次相同的查询,第一次执行完毕后,Mybatis会将查询到的数据缓存起来(缓存到内存中), 第二次执行相同的查询时,会从缓存中取数据,不再进行数据库的查询,从而提高查询效率。默认情况下,Mybatis开启了一级缓存。但是MyBatis整合Spring Boot时,一级缓存却没有生效。

1.2、代码

java 复制代码
/**
 * 验证MyBatis的一级缓存默认是开启的
 */
@Test
public void getUserByIdTest() {
	UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

	UserDO userDO1 = userMapper.getUserById(1L);
	System.out.println("userDO1 = " + userDO1);

	System.out.println("====================");

	UserDO userDO2 = userMapper.getUserById(1L);
	System.out.println("userDO2 = " + userDO2);
}

1.3、失效原因

当同一个线程开启事务时,同一个sql查询多次会走一级缓存,而不开启事务时,每一查询都是不同的sqlsession,即缓存为"失效"状态 。

1.4、解决

添加 @Transactional 注解。

java 复制代码
/**
 * 验证MyBatis的一级缓存默认是开启的
 */
@Transactional
@Test
public void getUserByIdTest() {
	UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

	UserDO userDO1 = userMapper.getUserById(1L);
	System.out.println("userDO1 = " + userDO1);

	System.out.println("====================");

	UserDO userDO2 = userMapper.getUserById(1L);
	System.out.println("userDO2 = " + userDO2);
}
相关推荐
Themberfue2 小时前
Redis ⑦-set | Zset
java·开发语言·数据库·redis·sql·缓存
Doker 多克4 小时前
Django 缓存框架
python·缓存·django
李少兄6 小时前
解决Spring Boot多模块自动配置失效问题
java·spring boot·后端
八股文领域大手子7 小时前
深入理解缓存淘汰策略:LRU 与 LFU 算法详解及 Java 实现
java·数据库·算法·缓存·mybatis·哈希算法
他҈姓҈林҈7 小时前
Spring Boot 支持政策
spring boot
ss2738 小时前
基于Springboot + vue + 爬虫实现的高考志愿智能推荐系统
spring boot·后端·高考
两点王爷9 小时前
springboot项目文件上传到服务器本机,返回访问地址
java·服务器·spring boot·文件上传
pjx9879 小时前
质量的“试金石”:精通Spring Boot单元测试与集成测试
spring boot·spring·单元测试·集成测试
王景程11 小时前
如何使用 Redis 缓存验证码
redis·缓存·mybatis
DO_Community11 小时前
DigitalOcean推出Valkey托管缓存服务
缓存