《SpringBoot》如何配置多个数据源

起因:

配置一个数据源我们知道可以在yml文件或者properties中编写配置,利用SpringBoot自动配置的特性完成绑定,但如果我们需要依赖一个以上的多个数据源这该怎么办呢?

解决方案:

不同的数据源配置要分开,避免混在一起,一定要注意正在操作的数据源是哪个。

首先我们需要排除SpringBoot对数据源的自动配置,利用exclude属性将DataSourceAutoConfiguration,DataSourceTransactionManagerAutoConfiguration,JdbcTemplateAutoConfiguration排除。
如下:

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class,
        DataSourceTransactionManagerAutoConfiguration.class,
        JdbcTemplateAutoConfiguration.class
})
@Slf4j
public class MultiDataSourceApplication {

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

这样做消除了框架对数据源一系列的自动配置,我们可以手动去控制它们。
先来看下properties配置文件,声明两种数据源url分别是default和text。

management.endpoints.web.exposure.include=*
spring.output.ansi.enabled=ALWAYS

default.datasource.url=jdbc:h2:file:~/default
default.datasource.username=MRyan
default.datasource.password=123456

text.datasource.url=jdbc:h2:file:~/text
text.datasource.username=
text.datasource.password=

然后我们手动配置一个数据源
创建一个配置类DataSourceProperties绑定Properties配置文件,数据源我们采用配置文件中声明的default url。

 /**
     * default数据源
     * 利用@ConfigurationProperties为DataSourceProperties赋值 获取application.properties配置文件
     */
    @Bean
    @ConfigurationProperties("default.datasource")
    public DataSourceProperties defaultSourceProperties() {
        return new DataSourceProperties();
    }

接着创建DataSource的bean并且输出log日志查看数据源url。

  /**
     * 创建DataSource的bean
     */
    @Bean
    public DataSource defaultDataSource() {
        DataSourceProperties dataSourceProperties = defaultSourceProperties();
        log.info("default datasource:{}", dataSourceProperties.getUrl());
        return dataSourceProperties.initializeDataSourceBuilder().build();
    }

然后为上述创建的DataSource的Bean创建对应的事务管理器

 /**
     * 为上述创建的DataSource的Bean创建对应的事务管理器
     */
    @Bean
    @Resource
    public PlatformTransactionManager defaultManager(DataSource defaultDataSource) {
        return new DataSourceTransactionManager(defaultDataSource);
    }

这个时候我们就配置好一个数据源了,可以运行输出下没什么问题。
在这里插入图片描述

用同样的方法我们配置第二个数据源text

//******************************************************

    /**
     * text数据源
     * 利用@ConfigurationProperties为DataSourceProperties赋值 获取application.properties配置文件
     */
    @Bean
    @ConfigurationProperties("text.datasource")
    public DataSourceProperties textSourceProperties() {
        return new DataSourceProperties();
    }

    /**
     * 创建DataSource的bean
     */
    @Bean
    public DataSource textDataSource() {
        DataSourceProperties dataSourceProperties = textSourceProperties();
        log.info("text datasource:{}", dataSourceProperties.getUrl());
        return dataSourceProperties.initializeDataSourceBuilder().build();
    }

    /**
     * 为上述创建的DataSource的Bean创建对应的事务管理器
     */
    @Bean
    @Resource
    public PlatformTransactionManager textManager(DataSource textDataSource) {
        return new DataSourceTransactionManager(textDataSource);
    }

最终的代码如下:


/**
 * @description: SpringBoot如何配置多个数据源
 * @Author MRyan
 * @Date 2020/10/8 15:53
 * @Version 1.0
 */
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class,
        DataSourceTransactionManagerAutoConfiguration.class,
        JdbcTemplateAutoConfiguration.class
})
@Slf4j
public class MultiDataSourceApplication {

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


    /**
     * default数据源
     * 利用@ConfigurationProperties为DataSourceProperties赋值 获取application.properties配置文件
     */
    @Bean
    @ConfigurationProperties("default.datasource")
    public DataSourceProperties defaultSourceProperties() {
        return new DataSourceProperties();
    }

    /**
     * 创建DataSource的bean
     */
    @Bean
    public DataSource defaultDataSource() {
        DataSourceProperties dataSourceProperties = defaultSourceProperties();
        log.info("default datasource:{}", dataSourceProperties.getUrl());
        return dataSourceProperties.initializeDataSourceBuilder().build();
    }

    /**
     * 为上述创建的DataSource的Bean创建对应的事务管理器
     */
    @Bean
    @Resource
    public PlatformTransactionManager defaultManager(DataSource defaultDataSource) {
        return new DataSourceTransactionManager(defaultDataSource);
    }


    //******************************************************
    /**
     * text数据源
     * 利用@ConfigurationProperties为DataSourceProperties赋值 获取application.properties配置文件
     */
    @Bean
    @ConfigurationProperties("text.datasource")
    public DataSourceProperties textSourceProperties() {
        return new DataSourceProperties();
    }

    /**
     * 创建DataSource的bean
     */
    @Bean
    public DataSource textDataSource() {
        DataSourceProperties dataSourceProperties = textSourceProperties();
        log.info("text datasource:{}", dataSourceProperties.getUrl());
        return dataSourceProperties.initializeDataSourceBuilder().build();
    }

    /**
     * 为上述创建的DataSource的Bean创建对应的事务管理器
     */
    @Bean
    @Resource
    public PlatformTransactionManager textManager(DataSource textDataSource) {
        return new DataSourceTransactionManager(textDataSource);
    }
}

运行并输出日志
在这里插入图片描述
正常运行,并没有什么问题。

查看actuator中beans发现却在其中
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WormholeStack

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值