分页的问题处理"/>
PageHelper 导致 SQL莫名分页的问题处理
PageHelper 导致 SQL莫名分页的问题处理
项目上使用PageHelper插件做分页功能,但是最近系统偶尔报服务器异常。
经过排查原因是存在一条SQL执行出错
SELECT * FROM ( SELECT TMP_PAGE.*, ROWNUM ROW_ID FROM ( select TEST_SEQ.nextval from dual ) TMP_PAGE) WHERE ROW_ID <= ? AND ROW_ID > ?
经过排查,该SQL的方法不可能存在分页的逻辑。
故怀疑是PageHelper 的使用,导致的SQL错误。
PageHelper是借助ThreadLocal实现分页功能的。Tomcat 使用的是线程池技术来处理HTTP的请求,当一个请求信息处理完毕后,该线程将被返回到线程池中。下一个请求来,继续从线程池中获取线程来处理。如果放回线程池中的线程的ThreadLocal 存在垃圾数据,那么这个垃圾数据将会对新的请求造成影响。
基于以上的猜测做了实验写了一个filter输出分页信息,结果证实了猜测内容。部分请求会输出分页信息:
@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,FilterChain filterChain) throws IOException, ServletException {Page<Object> page = PageHelper.getLocalPage();System.out.println(page);PageHelper.clearPage();filterChain.doFilter(servletRequest, servletResponse);}
问题的解决:添加filter,利用PageHelper.clearPage(), 清楚掉历史线程中的垃圾信息。造成问题的原因:部分使用PageHelper 没有使用好,应该严格按照 一个PageHelper.startPage 接着一个Mapper的查询。如果混乱的使用PageHelper就会导致以上问题。
更多推荐
PageHelper 导致 SQL莫名分页的问题处理
发布评论