也许你们都遇见过一种情况,已经开发好的情况下,突然项目框架变动
例如:因为瓶颈问题,数据库需要分库了,以前的客户库需要变成 客户库1 客户库2
本来以前所有的客户都放在一个库,用一个数据库链接就好了。
但是现在需要根据客户的企业标识来切换数据源。
拿jdbctemplate举例,以前一个库的时候只需要jdbctemplate.update(sql);
jdbctemplate的数据源只有一个DataSource
可是两个库,需要配置两个DataSource
那么jdbctemplate.update(sql);的时候就需要知道 切换到哪个DataSource中,可是怎么办呢?
一般人就会把jdbctemplate的源码改了,把所有的方法都加一个参数,变成jdbctemplate.update(sql,企业标识符);
在源码中判断
if(企业标识.equals("客户库1"))切换客户库1的数据库链接。
那你以前的代码是不是都要改过去。
显然是不明智的。
这个时候使用ThreadLocal就很明智了。
先看一个图:
图上看不明白?那我们来看一个简单的代码。
public final static ThreadLocal<String> s = new ThreadLocal<String>();
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
s.set("123");
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(s.get());
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
s.set("456");
System.out.println(s.get());
}
}).start();
}
可以拿出来运行,发现两个线程中,s里的String值,不会并发。是线程安全的。
大家看完可以互相讨论下。谢谢!