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。
com.alibaba.druid.sql.parser.ParserException: syntax error, error in :’limi1 1 limit ?,?’解决方法_第1张图片
sql的分页逻辑是通过MybatisPlus进行组装的,所以一开始以为是MybatisPlus的问题。

寻找问题:

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

问题原因:

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

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

线程中start的page 不能保证线程在当前执行退出时清理完page变量
com.alibaba.druid.sql.parser.ParserException: syntax error, error in :’limi1 1 limit ?,?’解决方法_第2张图片
我在项目中使用了PageHelper,上图使用的是正确的后面紧跟了Mybatis方法,但是我其它地方没有遵循这个方法,所以出现了这个问题!

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

解决方法:

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

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

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

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

com.alibaba.druid.sql.parser.ParserException: syntax error, error in :’limi1 1 limit ?,?’解决方法_第3张图片

你可能感兴趣的:(《知识增强系列》)