背景:
线上报出了一个sql异常,报错语句是这样的:select…from … where … ; limit 10;
分析:
1、定位报错sql语句进行分析
根据报错语句来看是limit前面加了分号导致的,于是根据日志定位到报错语句的mapper,发现代码里的sql确实在最后加了分号,但是这个查询是没有分页的,而实际却莫名其妙给加上了分页参数。
2、PageHelper的分页参数原理
因为项目中的分页使用的PageHelper,这里被加上的分页参数结合自己对PageHelper的了解就想到了大概率是线程中的分页参数没有被清除导致的。分析PageHelper的部分源码如下:
// 项目中使用分页查询的代码
PageHelper.startPage(req.getCurrent(), req.getSize());//开启分页
List<MyResultDTO> data = userRepository.pageList(req);//执行查询
跟踪代码PageHelper.startPage(req.getCurrent(), req.getSize()), 调用的PageMethod部分源码如下:
public abstract class PageMethod {
protected static final ThreadLocal<Page> LOCAL_PAGE = new ThreadLocal<Page>();
// 开始分页
public static <E> Page<E> startPage(int pageNum, int pageSize, boolean count, Boolean reasonable, Boolean pageSizeZero) {
Page<E> page = new Page<E>(pageNum, pageSize, count);
page.setReasonable(reasonable);
page.setPageSizeZero(pageSizeZero);
//当已经执行过orderBy的时候
Page<E> oldPage =