LOADING

加载过慢请开启缓存 浏览器默认开启

记一次java问题-查询接口偶发结果不同

2025/9/28 java page
  1. 问题现象
  2. 判断过程
  3. 问题解析
  4. 可能出现问题的不规范情况:

查询接口偶发结果不同

问题现象

填写表单时发现背景上的树状菜单结构轮询数据频闪,一般情况下是完整数据,但偶尔会出现数据量缺失的情况
f12 查看请求数据 两个接口的相应数据前半部分完全一致,缺失部分尾部数据。

判断过程

断点打在mp发现mp查后的数据已经缺失,
0.开启日志查看 sql语句 “相同”(最后发现是这里的原因)

mybatis-plus:
  configuration:
    local-cache-scope: statement
    ##log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl

怀疑是缓存问题
1.查看后已经默认关闭二级缓存,(实际上很多类未序列化也走不到二级缓存)
2.尝试关闭一级缓存,无效果

local-cache-scope: statement

3.开始怀疑是并发事务问题,本地没开事务
搞了个bingo2sql 看了下binlog 修改和更新的操作极少,但错误频繁,应该不是隔离级别的问题
4.头疼,应该是并发问题但是查不出来在哪。
5.最后发现原来的sql语句不同,在最后的结尾处错误数据莫名多了个limit ?
6.查了下,原来mybatis-plus(Mybatis-PageHelper)的分页插件PageHelper类使用limit ?,参数动态生成。

问题解析

PageHelper使用静态ThreadLocal,参数和线程绑定
需要保证PageHelper方法调用后要紧跟MyBatis查询方法
PageHelper方法中的finally块中会自动清楚ThreadLocal中的数据。

可能出现问题的不规范情况:

  • 分页上下文未清理导致干扰数据
  • 查询未执行导致上下文污染
  • 数据转换后分页信息丢失