问题描述:
近期项目在运行过程当中,经常发现某些查询结果与实际结果不相符,只显示部分结果。
查看后台日志,发现相应的sql后面自动添加了limit进行了分页导致。
但我实际并没有对此方法添加分页功能。经过百度查询相关问题
最终发现问题是在PageHelper插件的使用不规范导致的,
主要是因为程序中其他某个查询方法增加了 (1, 5);该方法执行后,但实际并没有调用sql语句,就会出现问题。
PageHelper分页原理:
PageHelper采用ThreadLocal来进行分页标识设置,pagehelper保证的是当代码执行到Executor 方法时出现错误,它会在finally快中清理ThreadLocal中的分页标识,如果代码没有执行到Executor方法就出现异常,那就会造成ThreadLocal污染。
当我们执行(1, 5);这一行的时候,其实是在当前线程的ThreadLocal中设置了分页的变量,当执行到(id)的时候会通过Executor拦截,从ThreadLocal中获取分页标记,如果存在分页标记就在当前执行的sql语句中增加分页表达式,当Executor拦截执行的时候finally中会清理ThreadLocal中的分页变量。但问题如果执行(1, 5),后续程序没有执行到相应的Executor方法时,则ThreadLocal被污染,分页变量并没有被清理。就会出现调用其他语句时自动添加上了limit。
解决方法:
在执行(1, 5)之后,要保证能够执行到相应的 mapper Executor。
如果代码没有要执行的 mapper Executor,则删除(1, 5)。