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

今天测试告诉我一个接口时不时的会报错,然后我去服务器检索了日志信息,发现这个接口偶尔会在SQL语句后面追加LIMIT 进行分页,但是我这个接口只是查询单条数据的,并且也没有设置分页.
这个就让人感到一丝丝尴尬了.
经过不断梳理,发现这个这个接口里面一共有两次数据库交互,第一次是查询单条数据,但是第二次是一个分页查询.并且使用的是PageHelper.startPage进行分页.
那么不出意外的话就是第二个查询的分页影响了第一个查询了.

在这里插入图片描述

在这里插入图片描述

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

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

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

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

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

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

在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿杰同学

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

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值