PageHelper中的ThreadLocal未清空问题

起因

前几天运维发现项目中的XXL执行的时候突然报异常,看了一波异常日志,发现XXl中的普通list查询竟然跑到PageHelper中的我写的分页权限过滤器了。正常来说,我只是简单查询,应该不会触发分页操作,但是日志很明显了。

问题分析

因为我大致知道PageHelper的分页机制,就是在当前线程中的ThreadLocal加个分页条件用来做当前分页操作。当时就隐隐感觉ThreadLocal是不是没清啊。
果然往上翻看日志,看到上面的日志,赫然报着列表查询中的创建事务异常,也就是说查询失败。那就很明显了,就是查询时候这条线程中ThreadLocal是不是没清退出返回到tomcat线程池中,然后拿旧线程进行复用的时候,阴差阳错给套到下一条无关的list查询上。

问题解决

随手百度了下,果然看出不少类似的问题。那答案很明显了,既然没清,咱就每次请求退出的时候,清理下ThreadLocal。

public class HeaderInterceptor implements AsyncHandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
     
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        PageHelper.clearPage();
    }
}
posted @ 2022-09-20 13:53  可飞  阅读(316)  评论(0编辑  收藏  举报