报错问题:
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实现分页,这也是问题所在。
解决方法:
做个记录,下次整合分页插件时应该考虑此问题,最好只使用一个分页插件即可!
我是一个膜拜大佬的程序员!