SpringBoot 动态切换多数据源

引入支持依赖

    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
        <version>3.4.0</version>
    </dependency>

进行数据源配置

spring:
  datasource:
    dynamic:
    #默认master数据源为数据库
    primary: master
      datasource:
        master:
          url:
          username:
          password:
          driver-class-name:
        slave:
          url:
          username:
          password:
          driver-class-name: 

实现配置类:

DynamicDataSourceConfig

public class DynamicDataSourceConfig {

    /**
     * 主数据库   application-dev.yml spring.datasource.dynamic.datasource.master
     *
     * @return DataSource
     */
    @Bean(name = "masterDataSource")
    @ConfigurationProperties("spring.datasource.dynamic.datasource.master")
    public DataSource masterDataSource() {
        return new DruidDataSource();
    }

    /**
     * 从数据库  application-dev.yml spring.datasource.dynamic.datasource.slave
     *
     * @return DataSource
     */
    @Bean(name = "slaveDataSource")
    @ConfigurationProperties("spring.datasource.dynamic.datasource.slave")
    public DataSource slaveDataSource() {
        return new DruidDataSource();
    }


    /**
     * 自定义的数据源DynamicRoutingDataSource添加到Spring容器里面去
     *
     * @param masterDataSource   主数据库
     * @param slaveDataSource    从数据库
     */
    @Bean
    @Primary
    public DynamicRoutingDataSource dataSource(DataSource masterDataSource, DataSource slaveDataSource) {
        Map<Object, Object> targetDataSources = Maps.newHashMapWithExpectedSize(2);
        // 每个key对应一个数据源
        targetDataSources.put("master", masterDataSource);
        targetDataSources.put("slave", slaveDataSource);
        return new DynamicRoutingDataSource(masterDataSource, targetDataSources);
    }

}

DynamicRoutingDataSource

public class DynamicRoutingDataSource extends AbstractRoutingDataSource {

    private static final ThreadLocal<String> contextHolder = new ThreadLocal<>();

    /**
     * 构造函数
     *
     * @param defaultTargetDataSource 默认的数据源
     * @param targetDataSources       多数据源每个key对应一个数据源
     */
    public DynamicRoutingDataSource(DataSource defaultTargetDataSource, Map<Object, Object> targetDataSources) {
        // 设置默认数据源
        super.setDefaultTargetDataSource(defaultTargetDataSource);
        // 设置多数据源. key value的形式
        super.setTargetDataSources(targetDataSources);
        super.afterPropertiesSet();
    }

    /**
     * 多数据源对应的key, 会通过这个key找到我们需要的数据源
     */
    @Override
    protected Object determineCurrentLookupKey() {
        return getDataSource();
    }

    /**
     * 设置使用哪个数据源
     *
     * @param dataSource 数据源对应的名字
     */
    public static void setDataSource(String dataSource) {
        contextHolder.set(dataSource);
    }

    /**
     * 获取数据源对应的名字
     * @return 数据源对应的名字
     */
    public static String getDataSource() {
        return contextHolder.get();
    }

    /**
     * 清空掉
     */
    public static void clearDataSource() {
        contextHolder.remove();
    }

}

启动了Application添加注解:

@SpringBootApplication(exclude = {
        org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class,
        DataSourceAutoConfiguration.class
})
@Import({DynamicDataSourceConfig.class})
public class TestApplication extends SpringBootServletInitializer {

    public static void main(String[] args) {
        SpringApplication.run(TestApplication .class, args);
    }

}

实际场景使用:

public String test(){
        //切换数据库为 master
        DynamicRoutingDataSource.setDataSource("master");
        Integer masterCount = testMapper.queryCount();

        //切换数据库为 slave
        DynamicRoutingDataSource.setDataSource("slave");
        Integer slaveCount = testMapper.queryCount();

        //清除
        DynamicRoutingDataSource.clearDataSource();
        return null;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值