解决ThreadLocal在线程池中被重复使用的问题

今天测试告诉我一个接口时不时的会报错,然后我去服务器检索了日志信息,发现这个接口偶尔会在SQL语句后面追加LIMIT 进行分页,但是我这个接口只是查询单条数据的,并且也没有设置分页.

这个就让人感到一丝丝尴尬了.

经过不断梳理,发现这个这个接口里面一共有两次数据库交互,第一次是查询单条数据,但是第二次是一个分页查询.并且使用的是PageHelper.startPage进行分页.

那么不出意外的话就是第二个查询的分页影响了第一个查询了.

在这里插入图片描述

在这里插入图片描述

什么会出现上面的情况呢,明明是第二个查询设置了PageHelper.startPage,但是为什么会影响第一个查询呢. 如果看过PageHelper.startPage源码的小伙伴就会知道PageHelper.startPage的底层是使用

ThreadLocal进行实现的,分页参数只会在当前的线程有效. 这么说好像没啥问题对吧.但是我们的web服务器tomcat其实是使用的线程池去接收浏览器的请求的,那么在线程池中线程是复用的.而我们之前

设置了PageHelper.startPage的线程也会随着当前任务结束回到线程池,但是他们的ThreadLocal的数据并没有被清除. 所以下次请求进来之后就有可能会复用到这个贤臣搞得ThreadLocal的数据.

那么第一个查询被加上LIMIT分页参数就不难理解了.

基于上面的原理,那么我们其实只要在请求最后返回的时候把当前线程的ThreadLocal清除掉就行了

我是写了一个拦截器,在请求返回的时候进行清除,这个解决的办法有很多,也可以在Controller最后返回的时候清除也是一样的效果

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论

打赏作者

阿杰同学

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值