【坑】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);
}
相关推荐
QQ51100828527 分钟前
python+springboot+django/flask的校园资料分享系统
spring boot·python·django·flask·node.js·php
WeiXin_DZbishe28 分钟前
基于django在线音乐数据采集的设计与实现-计算机毕设 附源码 22647
javascript·spring boot·mysql·django·node.js·php·html5
追风筝的人er1 小时前
企业管理系统如何实现自定义首页与千人千面?RuoYi Office 给出了完整方案
vue.js·spring boot·spring cloud
Java水解3 小时前
你真的会打印日志吗?基于 Spring Boot 的全方位日志指南
spring boot·后端
Java水解3 小时前
Spring Boot 实战:MyBatis 操作数据库(上)
spring boot·后端
知我Deja_Vu3 小时前
redisCommonHelper.generateCode(“GROUP“),Redis 生成码方法
数据库·redis·缓存
莫寒清5 小时前
Mybatis的插件原理
面试·mybatis
没有bug.的程序员8 小时前
电商秒杀系统深度进阶:高并发流量建模、库存零超卖内核与 Redis+MQ 闭环
数据库·redis·缓存·高并发·电商秒杀·流量建模·库存零超卖
troublea8 小时前
ThinkPHP3.x高效学习指南
mysql·nginx·缓存