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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

神唱ktv下载