springboot配置动态数据源

springboot配置动态数据源

  1. 编写保存数据源选择key的容器类
public class RoutingDataSourceContext {

    private static ThreadLocal<String> routingDataSourceKey = new ThreadLocal<>();

    public RoutingDataSourceContext(String key){
        routingDataSourceKey.set(key);
    }

    public static String getRoutingDataSourceKey(){
        String s = routingDataSourceKey.get();
        return s==null?"master":s;
    }

    public void close() {
        routingDataSourceKey.remove();
    }
}

  1. 编写AbstractRoutingDataSource的继承子类,重写determineCurrentLookupKey()方法
public class RoutingDataSource extends AbstractRoutingDataSource {
    @Override
    protected Object determineCurrentLookupKey() {
        return RoutingDataSourceContext.getRoutingDataSourceKey();
    }
}

  1. 编写自定义的DataSource自动配置类来实现多个数据源bean的注册
@Configuration
public class MyDataSourceConfiguration {
    Logger logger = LoggerFactory.getLogger(MyDataSourceConfiguration.class);

    @ConfigurationProperties(prefix = "spring.druid.datasource.master")
    @Bean
    public DataSource masterDataSource(){
        logger.info("create masterDataSource......");
        return DataSourceBuilder.create().build();
    }


    @Bean
    @ConfigurationProperties(prefix = "spring.druid.datasource.slave")
    public DataSource slaveDataSource(){
        logger.info("create slaveDataSource......");
        return DataSourceBuilder.create().build();
    }
    //@Autowired 根据类型注入,若有多个则用下面注解根据名称注入
    // @Qualifier("masterDataSource")
    @Bean
    @Primary
    public DataSource primaryDataSource(
            @Autowired @Qualifier("masterDataSource") DataSource masterDataSource,
            @Autowired @Qualifier("slaveDataSource") DataSource slaveDataSource
    ){
        logger.info("create primaryDataSource......");
        //创建子类,封装dataSourceMap并赋值TargetDataSources,设置默认数据源DefaultTargetDataSource,
        //这些属性都在spring提供的AbstractRoutingDataSource类中,数据源的选择,存放也在此类中
        //TargetDataSources此map集合就是为了实现多数据源spring提供的map
        RoutingDataSource routingDataSource = new RoutingDataSource();
        Map<Object, Object> dataSourceMap = new HashMap<>();
        dataSourceMap.put("master",masterDataSource);
        dataSourceMap.put("slave",slaveDataSource);

        routingDataSource.setTargetDataSources(dataSourceMap);
        routingDataSource.setDefaultTargetDataSource(masterDataSource);
        //到此相当于我们自己完成了对AbstractRoutingDataSource一些属性的封装
        return routingDataSource;
    }
}

注意: 要在springboot启动类的@SpringbootApplication中排除原自动配置类
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值