[特殊字符] 【踩坑记录】没调 startPage(),SQL 却被自动分页了?

🚀 【踩坑记录】没调 startPage(),SQL 却被自动分页了?

1. 现象

Controller 中没写 PageHelper.startPage(),但执行 SQL 时末尾自动出现了 LIMIT,导致查询结果数量不对。

2. 核心原因:ThreadLocal 污染

PageHelper 的分页参数存放在 ThreadLocal 中。

  • 脏数据来源 :如果前一个请求调用了 startPage()没有执行查询 (由于异常或 if 逻辑提前返回),分页参数会残留在线程中。
  • 线程池复用:Tomcat 线程池会复用线程。下一个请求(即你的接口)碰巧使用了这个"脏线程",PageHelper 拦截器就会自动读取残余参数并触发分页。
3. 诱因:参数自动匹配 (supportMethodsArguments)

检查配置文件:pagehelper.supportMethodsArguments: true

如果开启此项,PageHelper 会自动反射扫描你的请求对象。只要你的公共类里有 pageNumpageSize 字段且不为空,它就会自动开启分页,无需手动调用。

4. 解决方案
  • 规范化 :确保 startPage() 后紧跟查询,或在 finally 块执行 PageHelper.clearPage()

  • 改配置 :建议将 support-methods-arguments 设为 false,由代码显式控制分页,减少"黑盒"行为。

    yml 复制代码
    pagehelper:
      support-methods-arguments: false
  • 强力清空 :在不需要分页的接口开头手动调用 PageHelper.clearPage() 以防万一。

相关推荐
敲个大西瓜10 小时前
Redis一百道核心面试题
数据库·redis·缓存
阿里云大数据AI技术10 小时前
EMR Serverless Spark AI Function 的双维降本实践
人工智能·sql·spark
無a伟13 小时前
Redis持久化详解:RDB与AOF原理、配置、优缺点
数据库
小罗水13 小时前
附录A 各微服务完整 application.yml 配置汇总
数据库·elasticsearch·微服务
muddjsv14 小时前
SQLite 外键进阶:CASCADE / SET NULL / 级联更新与完整性校验
数据库·sqlite
APItesterCris14 小时前
Open Claw 实战教程:5 分钟搭建京东商品自动化监控与数据分析系统
大数据·运维·数据库·数据仓库·自动化
Nturmoils14 小时前
查库存的 SQL 时灵时不灵,最后发现是 WHERE 里两个函数在打架
数据库
不想纳尼的青春15 小时前
where = 的作用?会影响性能吗?count(*) 和 count()哪个快?
数据库·oracle
倔强的石头_15 小时前
Spring Boot 接入金仓数据库:配置分层、启动自检与常见错误
数据库
杨云龙UP16 小时前
生产环境Oracle表空间扩容实战:使用Toad for Oracle图形界面新增Datafile(ASM+OMF)
linux·运维·数据库·oracle·表空间·asm 存储管理·toad