码农翻身

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

- by MRyan, 2020-12-06


起因:

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

解决方案:

<font color='red'>不同的数据源配置要分开,避免混在一起,一定要注意正在操作的数据源是哪个。</font>

首先我们需要排除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发现却在其中
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

作者:MRyan


本文采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
转载时请注明本文出处及文章链接。本文链接:https://www.wormholestack.com/archives/516/
2024 © MRyan 31 ms