SpringBoot实现自动的动态多数据源

 

数据源路由类

public class DynamicDataSource extends AbstractRoutingDataSource {

    private final Map<String, DataSource> dynamicDataSources = Maps.newConcurrentMap();
    private final DynamicDataSourceProvider dynamicDataSourceProvider;

    public DynamicDataSource(DynamicDataSourceProvider dynamicDataSourceProvider) {
        this.dynamicDataSourceProvider = dynamicDataSourceProvider;
        this.dynamicDataSources.put("default", dynamicDataSourceProvider.defaultDataSource());
        super.setTargetDataSources(
            Collections.singletonMap("defalut", this.dynamicDataSources.get("default")));
    }

    @Override
    protected String determineCurrentLookupKey() {
        return this.dynamicDataSourceProvider.lookUpKey();
    }

    @Override
    protected DataSource determineTargetDataSource() {
        String key = this.determineCurrentLookupKey();
        Preconditions.checkArgument(key != null, "determine target key must be not null");
        DataSource dataSource =
            this.dynamicDataSources.computeIfAbsent(
            key, this.dynamicDataSourceProvider::createDataSource);
        if (dataSource != null) {
            return dataSource;
        }
        return Optional.ofNullable(this.dynamicDataSources.get("defalut"))
            .orElse(super.determineTargetDataSource());
    }
}

数据源提供接口

public interface DynamicDataSourceProvider {

  String lookUpKey();

  DataSource defaultDataSource();

  DataSource createDataSource(String lookUpKey);
}

注册到Spring中

@Configuration(proxyBeanMethods = false)
public class DynamicDataSourceAutoConfiguration {

  @Bean
  @Primary
  public DataSource dynamicDataSource(DynamicDataSourceProvider dynamicDataSourceProvider) {
    return new DynamicDataSource(dynamicDataSourceProvider);
  }
}

实现具体的数据源提供

@Component
public class GroupDataSource implements DynamicDataSourceProvider {
   
    @Override
    public String lookUpKey() {
        //从这个方法提供数据源的Key
    }
      @Override
    public DataSource defaultDataSource() {
        //创建一个默认的数据源
    }
     @Override
    public DataSource createDataSource(String lookUpKey) {
        //根据动态的数据源Key创建数据源
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值