【坑】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);
}
相关推荐
养军博客20 分钟前
Spring Boot 3.x + Spring Security 6.x 整合 JWT 实战:jjwt 与 java-jwt 两种工具库详解
java·spring boot·springsecurity
txxzjmzlh12 小时前
SpringBoot 统⼀功能处理
java·spring boot·后端
秋天的怀念_David19 小时前
算法一千零一夜 · 第二十六夜 协议的母语
java·spring boot·算法
余槐i20 小时前
MySQL 8.0 联合索引走错:为什么加了索引查询反而从 200ms 变成 8s
java·spring boot·mysql·docker·性能优化
AI技术新视界1 天前
LLM 提示词缓存(Prompt Caching)的秘密
人工智能·缓存·llm·prompt
CoderYanger1 天前
Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)
java·数据库·spring·面试·职场和发展·java-ee·mybatis
nice_lcj5201 天前
【从零理解 Spring AI · 03】Spring AI 在 Spring 生态里的位置
java·spring boot·大模型·spring ai·ai应用开发
AI源码2 天前
旅游推荐管理系统
spring boot
lsc_blog2 天前
年底还在招的岗位,先确认缺口和到岗要求
git·缓存·ci/cd·职场和发展·github
aiks_yuan2 天前
Spring Boot SSE 流式输出变成一次性返回怎么办:大模型打字机效果失效的 5 个原因(Spring Boot 4.1.2 实测)
spring boot