Spring的多数据源支持—-AbstractRoutingDataSource,AbstractRoutingDataSource定义了抽象的determineCurrentLookupKey方法,子类实现此方法,来确定要使用的数据源

    1. public abstract class AbstractRoutingDataSource extends AbstractDataSource implements InitializingBean {
    2. protected DataSource determineTargetDataSource() {
    3. Assert.notNull(this.resolvedDataSources, "DataSource router not initialized");
    4. Object lookupKey = determineCurrentLookupKey();
    5. DataSource dataSource = this.resolvedDataSources.get(lookupKey);
    6. if (dataSource == null && (this.lenientFallback || lookupKey == null)) {
    7. dataSource = this.resolvedDefaultDataSource;
    8. }
    9. if (dataSource == null) {
    10. throw new IllegalStateException("Cannot determine target DataSource for lookup key [" + lookupKey + "]");
    11. }
    12. return dataSource;
    13. }
    14. // 确定当前要使用的数据源
    15. protected abstract Object determineCurrentLookupKey();
    16. }

    Druid 实现多数据源支持,核心是Overwrite AbstractRoutingDataSource 的 determineCurrentLookupKey 方法

    1. public class MultipleDataSource extends AbstractRoutingDataSource {
    2. public static final String DATA_SOURCE_A = "dataSourceTestA"; // A库
    3. public static final String DATA_SOURCE_B = "dataSourceTestB"; // B库
    4. private static final ThreadLocal<String> dataSourceKey = new ThreadLocal<String>();
    5. public static void setDataSourceKey(String dataSource) {
    6. dataSourceKey.set(dataSource);
    7. }
    8. @Override
    9. protected Object determineCurrentLookupKey() {
    10. return dataSourceKey.get();
    11. }
    12. public static void clear(){
    13. dataSourceKey.remove();
    14. }
    15. }