• Spring Boot 配置多数据源


    Spring Boot 配置多数据源

    作者:Grey

    原文地址:

    博客园:Spring Boot 配置多数据源

    CSDN:Spring Boot 配置多数据源

    说明

    本文主要介绍了 Spring Boot 下如何配置多数据源。

    环境和版本

    Java 版本:17

    Spring Boot 版本:3.0.0

    数据库:H2

    注:本示例基于 JdbcTemplate,如果使用 JPA,Hiberante 或者 Mybatis 等,方法类似。

    代码说明

    首先,配置两个数据源,这里我们基于 H2 配置了两个简单数据源,由于 H2 是内存数据库,无需手动新建

    foo.datasource.url=jdbc:h2:mem:foo
    foo.datasource.username=sa
    foo.datasource.password=
    foo.datasource.driver-class-name=org.h2.Driver
    bar.datasource.url=jdbc:h2:mem:bar
    bar.datasource.username=sa
    bar.datasource.password=
    bar.datasource.driver-class-name=org.h2.Driver
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    接下来在 resources 新建一个 db 文件夹,里面存两个数据库的初始化脚本

    schema.sql

    DROP TABLE IF EXISTS USER_INFO;
    
    CREATE TABLE USER_INFO
    (
        id        INT AUTO_INCREMENT PRIMARY KEY,
        user_name VARCHAR(250) NOT NULL,
        email     VARCHAR(250) DEFAULT NULL
    );
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    foo 数据源的初始化数据 foo-data.sql

    INSERT INTO
        USER_INFO (user_name, email)
    VALUES
        ('grey-foo', 'abc@gmail.com'),
        ('jack-foo', 'jack@email.com');
    
    • 1
    • 2
    • 3
    • 4
    • 5

    bar 数据源的初始化数据 bar-data.sql

    INSERT INTO USER_INFO (user_name, email)
    VALUES ('grey-bar', 'abc@gmail.com'),
           ('jack-bar', 'jack@email.com');
    
    • 1
    • 2
    • 3

    脚本和数据源配置好以后,接下来要准备两个数据源的配置类信息,以任意一个数据源的配置类信息为例(另外一个同理)

    foo 数据源的配置信息如下

    @Configuration
    @ConfigurationProperties(prefix = "foo.datasource")
    @Slf4j
    public class FooDataSourceConfig {
    
      @Bean
      public PlatformTransactionManager fooTxManager(DataSource fooDataSource) {
        return new DataSourceTransactionManager(fooDataSource);
      }
    
      @Bean
      public DataSourceProperties fooDataSourceProperties() {
        return new DataSourceProperties();
      }
    
      @Bean
      @Primary
      public DataSource fooDataSource() {
        DataSourceProperties dataSourceProperties = fooDataSourceProperties();
        // schema init
        DatabasePopulator databasePopulator =
            new ResourceDatabasePopulator(
                new ClassPathResource("db/schema.sql"), new ClassPathResource("db/foo-data.sql"));
        DataSource ds = dataSourceProperties.initializeDataSourceBuilder().build();
        DatabasePopulatorUtils.execute(databasePopulator, ds);
        log.info("foo datasource: {}", dataSourceProperties.getUrl());
        return ds;
      }
    
      @Bean
      @Primary
      public JdbcTemplate fooJdbcTemplate(@Qualifier("fooDataSource") DataSource dataSource) {
        return new JdbcTemplate(dataSource);
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    需要注意的点,@Primary参数定义了该数据源是主数据源,也就是说,调用数据源的时候,如果没有指定名称默认就是用这个数据源。

    fooDataSource中,定义了初始化脚本的位置

     DatabasePopulator databasePopulator =
            new ResourceDatabasePopulator(
                new ClassPathResource("db/schema.sql"), new ClassPathResource("db/foo-data.sql"));
    
    • 1
    • 2
    • 3

    另外一个 BarDataSourceConfig 同理。

    完成上述配置后,在启动类中注入这两个数据源对应的JdbcTemplate

    @SpringBootApplication
    @Slf4j
    public class SpringMultiDatasourceApplication implements CommandLineRunner {
      private final JdbcTemplate fooTemplate;
      private final JdbcTemplate barTemplate;
      private final JdbcTemplate defaultTemplate;
    
      public SpringMultiDatasourceApplication(
          @Qualifier("fooJdbcTemplate") JdbcTemplate fooTemplate,
          @Qualifier("barJdbcTemplate") JdbcTemplate barTemplate,
          JdbcTemplate defaultTemplate) {
        this.fooTemplate = fooTemplate;
        this.barTemplate = barTemplate;
        this.defaultTemplate = defaultTemplate;
      }
    
      @Override
      public void run(String... args) throws Exception {
        fooTemplate.queryForList("SELECT * FROM USER_INFO").forEach(row -> log.info(row.toString()));
        log.info("----");
        barTemplate.queryForList("SELECT * FROM USER_INFO").forEach(row -> log.info(row.toString()));
        log.info("----");
        defaultTemplate
            .queryForList("SELECT * FROM USER_INFO")
            .forEach(row -> log.info(row.toString()));
      }
      
      public static void main(String[] args) {
        SpringApplication.run(SpringMultiDatasourceApplication.class, args);
      }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    本示例中,注入了三个JdbcTemplate,其中两个通过@Qualifier指定了名称,还有一个defaultTemplate并未指定名称,所以取的就是有@Primary注解的JdbcTemplate

    运行主函数,打印出如下信息

    {ID=1, USER_NAME=grey-foo, EMAIL=abc@gmail.com}
    {ID=2, USER_NAME=jack-foo, EMAIL=jack@email.com}
    ----
    {ID=1, USER_NAME=grey-bar, EMAIL=abc@gmail.com}
    {ID=2, USER_NAME=jack-bar, EMAIL=jack@email.com}
    ----
    {ID=1, USER_NAME=grey-foo, EMAIL=abc@gmail.com}
    {ID=2, USER_NAME=jack-foo, EMAIL=jack@email.com}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    可以看到效果,默认的JdbcTemplate取的是 foo 数据源的信息。

    完整代码

    spring-multi-datasource

    参考资料

    Spring Boot 2 Multiple Datasources initialize schema

    Configure and Use Multiple DataSources in Spring Boot

  • 相关阅读:
    CTFshow_MISC入门_图片篇(基础操作&信息附加)wp
    罗丹明聚乙二醇叠氮,Rhodamine-PEG-N3,N3-PEG-Rhodamine,罗丹明PEG叠氮,叠氮PEG罗丹明,叠氮聚乙二醇罗丹明
    Python Opencv实践 - 视频目标追踪CamShift
    关于在代码中vector的一些使用
    实用!Python大型Excel文件处理:快速导入、导出与批量处理
    docker基础用法
    RocketMQ源码阅读(十四)延迟消息
    Python实操:内存管理与优化策略
    单片机C语言实例:3、数码管累加与累减动态显示
    vue模板语法上集
  • 原文地址:https://blog.csdn.net/hotonyhui/article/details/128112755