ThreadLocal使用不当异常错误

多线程ThreadLocal使用中异常错误:

 public abstract class CustomerContextHolder {
  
     public final static String SESSION_FACTORY_PORTAL1 = "portal1";
     public final static String SESSION_FACTORY_BO1 = "bo1";
     
     private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();  
     
     public static void setContextType(String contextType) {  
         contextHolder.set(contextType);  
     }  
       
     public static String getContextType() {  
         return contextHolder.get();  
     }  
       
     public static void clearContextType() {  
         contextHolder.remove();  
     }  
 }
CustomerContextHolder.setContextType(CustomerContextHolder.SESSION_FACTORY_PORTAL1);
List<SellLimit> sellLimitList = sellLimitMapper.selectUpdateLimit(params);
//切换其他数据源
CustomerContextHolder.setContextType(idCompart);
List<SellLimit> sellLimitList = sellLimitMapper.selectUpdateLimit(params);

1.系统采用的是分库的方式,进行数据处理时候会进行数据源切换。有db1,db2,db3,db4等数据源。
2.web应用服务器中使用线程池,核心线程20个。
3.请求A到web服务器,经过逻辑判断,切换数据源到db2,tomcat线程池分配的线程是thread2,然后在线程threadlocal.setcontent(db2)方法存放db2数据源变量。进行业务处理,放回线程池此线程。
4.请求B到web服务器,进行业务逻辑处理,使用默认数据源,不进行切换分库,由于线程池复用的,然后tomcat线程池分配的线程是thread2,该线程threadlocal存放的仍然是db2数据源,进行业务处理就会报错。
5.每次使用threadlocal.setcontent(db2)方法之后,需要调用threadlocal.remove方法进行变量的销毁。

注意:此错误会随着并发量的大小而出现的,偶然的,但是根据具体的逻辑就可以定位到的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值