// 未分类
切换数据源的一种简单方法
发布 2019-12-27 · 永久链接
作者很懒,没有描述~~~
基本就是使用`AbstractRoutingDataSource`实现的
继承该类,实现一个抽象方法
``` java
@Override
protected Object determineCurrentLookupKey() {
return name;
}
```
抽象方法返回要使用的dataSource的名字。其中使用ThreadLocal来保存当前使用的名字。
``` java
/**
* @author dengqn 2019/12/25-11:15
*/
public class DynamicDataSource extends AbstractRoutingDataSource {
public static final ThreadLocal context = new ThreadLocal<>();
public static final String MAIN_DATA_SOURCE = "mainDataSource";
public static final String DATA_SOURCE_240 = "dataSource240";
public static void setDataSource(String type) {
context.set(type);
}
public static String getDataSource() {
return context.get();
}
public static void clearDataSource() {
context.remove();
}
@Override
protected Object determineCurrentLookupKey() {
return context.get();
}
}
```
然后配置多个dataSource, 让他持有(有一个map存放),每个dataSource有不同的名字。
``` xml
```
注意的是,如果当前ThreadLocal 返回的name找不到,会使用**默认**的DataSource.
然后就可以使用我们自定义的这个可变的dataSource了,而且切换的时候线程之间不会互相影响。
使用的时候就是直接切换就行了。
``` java
DynamicDataSource.clearDataSource();
DynamicDataSource.setDataSource(DynamicDataSource.DATA_SOURCE_240);
// 需要切换查询的业务代码
DynamicDataSource.clearDataSource();
DynamicDataSource.setDataSource(DynamicDataSource.MAIN_DATA_SOURCE);
```