基本就是使用`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); ```