起因
前几天运维发现项目中的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();
}
}
标签:分页,查询,ThreadLocal,线程,清空,日志,PageHelper
From: https://www.cnblogs.com/zhou-yuan/p/16710809.html