当前位置: 首页 > article >正文

记录被mybatis一级缓存坑的问题

  • 背景

我之前有个方法需要多次调用数据库拿数据,由于每次查询数据比较少,所以我前期都是直接查数据库拿的,准备后面再改缓存

// 查询代码  假设在A方法中
List<LeftOrderType> leftOrderTypes = orderTypeMapper.selectList(wrapper);
// A方法的后面我对查询到的结果集做了改动,删除了集合中的元素

我是通过其他方法调用A方法去查询的,但是有一天我发现有个方法连续调用了A方法五次,每次只有第一次有结果,后续的四次调用在A方法的查询代码中返回的List都是空的,我查资料说是mybatis一级缓存的问题,但是我这里查询的动作都是在A方法中的,理论上应该是每次调用A方法查询的都是新的集合,但是只有第一次调用有结果,其后续调用都是空集合。

  • 原因

后来debug发现每次拿到的集合内存地址都是一样的,说明确实是mybatis缓存生效了,再后来排查发现我调用A方法的方法被打上了@Transactional注解,这下找到原因了,在同一个事务中多次进行相同的查询mybatis会返回第一次查询的结果集(mybatis一级缓存的是结果集的引用),但是我在A方法中对返回的结果集做了修改(删除了结果集的元素),所以后续的几次缓存直接返回这个集合导致拿到的都是空集合。

  • 解决方案
  1. 将mapper的查询放入新构造的集合中,不改动原来的mapper返回的集合
 List<LeftOrderType> leftOrderTypes = new ArrayList<>(orderTypeMapper.selectList(wrapper));
  1. 每次做完操作后清空一级缓存
 sqlSession.clearCache();
http://www.lryc.cn/news/2398306.html

相关文章:

  • 遥感影像建筑物变化检测
  • 【数据库】《DBA实战手记》- 读书笔记
  • 多模态大语言模型arxiv论文略读(103)
  • 汇编语言基础: 搭建实验环境
  • SIFT 算法原理详解
  • 基于springboot的益智游戏系统的设计与实现
  • 短剧系统开发文案:打造沉浸式互动娱乐新体验
  • 第十二节:第四部分:集合框架:List系列集合:LinkedList集合的底层原理、特有方法、栈、队列
  • 多模态大语言模型arxiv论文略读(104)
  • 【C++高级主题】多重继承下的类作用域
  • 基于Android的一周穿搭APP的设计与实现 _springboot+vue
  • 机器学习——使用多个决策树
  • C# 中的对话框与导航:构建流畅用户交互的完整指南
  • DeepSeek - 尝试一下GitHub Models中的DeepSeek
  • 【判断酒酒花数】2022-3-31
  • 对称加密-非对称加密
  • 【OCCT+ImGUI系列】011-Poly-Poly_Triangle三角形面片
  • 【机器学习基础】机器学习入门核心算法:Mini-Batch K-Means算法
  • 机器学习实战36-基于遗传算法的水泵调度优化项目研究与代码实现
  • 计算机视觉与深度学习 | 基于Matlab的门禁指纹识别与人脸识别双系统实现
  • TypeScript 定义同步方法
  • debian12.9或ubuntu,vagrant离线安装插件vagrant-libvirt,20250601
  • 【仿muduo库实现并发服务器】使用正则表达式提取HTTP元素
  • 核心机制:流量控制
  • Java中并发修改异常如何处理
  • 极智项目 | 基于PyQT实现的YOLOv12行人目标检测软件设计
  • JavaScript 对象展开语法
  • 简单transformer运用
  • vscode不满足先决条件问题的解决——vscode的老版本安装与禁止更新(附安装包)
  • RustDesk 搭建自建服务器并设置服务自启动