com.alibaba.druid.sql.parser.ParserException: syntax error, error in :’limi1 1 limit ?,?’解决方法

报错问题:

Caused by: com.alibaba.druid.sql.parser.ParserException: syntax error, error in :’limi1 1 limit ?,?’,
expect LIMIT, actual LIMIT limit

前言

昨晚被项目的一个BUG折磨到一点多才睡觉,这个BUG也是很蛋疼,我的执行的sql语句里多出来一个limit。
在这里插入图片描述
sql的分页逻辑是通过MybatisPlus进行组装的,所以一开始以为是MybatisPlus的问题。

寻找问题:

网上说有可能是两个分页拦截器导致的,于是查看了项目中,使用了MybatisPlus的分页拦截器,也是用了PageHelper做分页,于是就想到了PageHelper的问题!

问题原因:

PageHelper 方法使用了静态的 ThreadLocal 参数,分页参数和线程是绑定的。

只要你可以保证在 PageHelper 方法调用后紧跟 MyBatis 查询方法,这就是安全的。因为 PageHelper 在 finally 代码段中自动清除了 ThreadLocal 存储的对象。

线程中start的page 不能保证线程在当前执行退出时清理完page变量
在这里插入图片描述
我在项目中使用了PageHelper,上图使用的是正确的后面紧跟了Mybatis方法,但是我其它地方没有遵循这个方法,所以出现了这个问题!

所以在生产环境中,PageHelper的调用在多线程的情况下没有清除ThreadLocal存储的对象,所以正常的sql语句执行时,会被PageHelper强行增加一个limit实现分页,这也是问题所在。

解决方法:

  • PageHelper方法调用后紧跟Mybatis方法

  • 在使用PageHelper的方法最后调用PageHelper.clearPage();

做个记录,下次整合分页插件时应该考虑此问题,最好只使用一个分页插件即可!

我是一个膜拜大佬的程序员!

在这里插入图片描述

  • 8
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值