ThreadLocal 切换数据源的使用

百度安全验证https://baijiahao.baidu.com/s?id=1651506162577833204&wfr=spider&for=pc

前言:首先说下什么是多数据源?无论是在学时中还是实际开发中,很多项目都是单数据源,比如连接mysql。但是还是有一些项目需要多数据源的。

①、项目中存储的数据量很大,一个服务器扛不住,需要将一部分数据存储在另外一个服务器里,然而我们还要每天去访问这些存储的数据。

②、项目与其他项目对接,需要连接另外一个项目的数据库(这里可能有人会提议使用API,但这是相对于第三方公司,人家不会把数据库信息暴露给你的,所以才提供的api。)

在网上百度,发现多数据源切换都会使用到ThreadLocal,如图:

多数据源

这是小编在开发多数据源中的代码。相信没有使用过ThreadLocal的伙伴,看到这段代码肯定很陌生。先解释下ThreadLocal是什么?ThreadLocal一般称为线程本地变量,它是一种特殊的线程绑定机制,将变量与线程绑定在一起,为每一个线程维护一个独立的变量副本。通过ThreadLocal可以将对象的可见范围限制在同一个线程内。更直白点讲,ThreadLocal可以理解为将对象的作用范围限制在一个线程上下文中,使得变量的作用域为“线程级”。ThreadLocal将变量绑定在线程上,在一个线程周期内,无论“你身处何地”,只需通过其提供的get方法就可轻松获取到对象。极大地提高了对于“线程级变量”的访问便利性。

查看ThreadLocal的源码

ThreadLocal的源码

可以看到内部有一个ThreadLocalMap,每次都会获取当前线程,在从当前线程中插入或拿取值,这样就保证了只能当前线程能插入和拿取自己的值,其他线程是访问不到的。这样也就避免了传参问题。(脑补下,比如一个值好几个方法都要用到,普通的做法就是一个一个方法传递下去,但是使用ThreadLocal后,调用get方法就可以拿到参数值了,是不是很方便),在多数据源中,会频繁的调用数据库,采用传参来决定使用什么数据源肯定是不可取的,采用ThreadLocal完美解决数据库切换问题。缺点就是以空间换时间的方式(与synchronized相反),以耗费内存为代价,但是大大减少了线程同步(如synchronized)所带来性能消耗以及减少了线程并发控制的复杂度。

总结:

ThreadLocal是什么?它就是线程本地变量,保证每个线程都能设置和拿到自己的值,其他线程被拒之门外。ThreadLocal解决传参问题。ThreadLocal以耗费内存为代价。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值