Spring Boot 配置多数据源

spring,boot,配置,数据源 · 浏览次数 : 1910

小编点评

**Spring Boot 配置多数据源作者:Grey原文地址:博客园:Spring Boot 配置多数据源CSDN:Spring Boot 配置多数据源说明本文主要介绍了 Spring Boot 下如何配置多数据源。** **环境和版本** * Java 版本:17 * Spring Boot 版本:3.0.0 **数据库** * H2 **步骤** 1. **配置数据源** * 创建两个数据源配置类:fooDataSourceConfig 和 barDataSourceConfig。 2. **创建数据库文件夹** * 创建一个名为 `db` 的文件夹,并包含两个数据库的初始化脚本 `schema.sql` 和 `foo-data.sql`。 3. **创建数据源配置类** * 在 `FooDataSourceConfig` 和 `barDataSourceConfig` 中定义以下属性: * `fooDataSourceProperties`:用于配置 `fooDataSource`。 * `fooDataSource`:用于配置 `fooDataSource`。 * `barDataSourceProperties`:用于配置 `barDataSource`。 * `barDataSource`:用于配置 `barDataSource`。 4. **配置 `fooDataSource`** * 在 `FooDataSourceConfig` 中定义 `fooTxManager`、`fooDataSourceProperties` 和 `fooDataSource`。 5. **配置 `fooJdbcTemplate`** * 在 `FooDataSourceConfig` 中定义 `fooJdbcTemplate`,并使用 `@Qualifier` 注解指定 `fooDataSource`。 6. **配置 `barDataSource`** * 在 `barDataSourceConfig` 中定义 `fooDataSourceProperties` 和 `barDataSource`。 7. **配置默认数据源** * 在 `SpringMultiDatasourceApplication` 中定义 `defaultTemplate`,并使用 `@Primary` 注解指定其为默认数据源。 8. **运行主类** * 在 `SpringMultiDatasourceApplication` 中使用 `@Autowired` 注解注入 `fooTemplate`、`barTemplate` 和 `defaultTemplate`。 * 调用 `fooTemplate`、`barTemplate` 和 `defaultTemplate` 的方法查询数据库数据。 **注意** * `@Primary` 注解定义了 `fooDataSource` 是默认数据源。 * `@Qualifier` 注解用于指定 `fooDataSource`,并使用 `@Primary` 注解定义 `fooTemplate` 是默认数据源。 * `DatabasePopulator` 用于执行数据库初始化脚本。

正文

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

接下来在 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
);

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

INSERT INTO
    USER_INFO (user_name, email)
VALUES
    ('grey-foo', 'abc@gmail.com'),
    ('jack-foo', 'jack@email.com');

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

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

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

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);
  }
}

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

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

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

另外一个 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);
  }

}

本示例中,注入了三个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}

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

完整代码

spring-multi-datasource

参考资料

Spring Boot 2 Multiple Datasources initialize schema

Configure and Use Multiple DataSources in Spring Boot

与Spring Boot 配置多数据源相似的内容:

Spring Boot 配置多数据源

Spring Boot 配置多数据源 作者:Grey 原文地址: 博客园:Spring Boot 配置多数据源 CSDN:Spring Boot 配置多数据源 说明 本文主要介绍了 Spring Boot 下如何配置多数据源。 环境和版本 Java 版本:17 Spring Boot 版本:3.0.

Mapper that could not be found

现象1 mapper 资源扫不到 resources 建的是 目录 ,不是 package 所以如果直接 a.b 的方式创建,会扫描不到 mapper.xml 文件 现象2 缺少配置文件 HisDruidConfig SpringBoot 配置多数据源 现象3 没有启动添加扫描 启动项缺少扫描 Ma

如何在Spring Boot中配置MySQL数据库连接数

1.如何在Spring Boot中配置MySQL数据库的连接数 1.1主要配置 在Spring Boot中配置MySQL数据库连接数通常涉及到两个主要的配置: (1)数据源配置:这通常是在application.properties或application.yml文件中完成的,用于设置数据源的基本参

实例讲解Spring boot动态切换数据源

摘要:本文模拟一下在主库查询订单信息查询不到的时候,切换数据源去历史库里面查询。 本文分享自华为云社区《springboot动态切换数据源》,作者:小陈没烦恼 。 前言 在公司的系统里,由于数据量较大,所以配置了多个数据源,它会根据用户所在的地区去查询那一个数据库,这样就产生了动态切换数据源的场景。

Java SpringBoot 加载 yml 配置文件中字典项

实际项目中,如果将该类信息放配置文件中的话,一般会结合Nocas一起使用 将字典数据,配置在 yml 文件中,通过加载yml将数据加载到 Map中 Spring Boot 中 yml 配置、引用其它 yml 中的配置。# 在配置文件目录(如:resources)下新建application-xxx

Spring Boot应用中如何动态指定数据库,实现不同用户不同数据库的场景

当在 Spring Boot 应用程序中使用Spring Data JPA 进行数据库操作时,配置Schema名称是一种常见的做法。然而,在某些情况下,模式名称需要是动态的,可能会在应用程序运行时发生变化。比如:需要做数据隔离的SaaS应用。 所以,这篇博文将帮助您解决了在 Spring Boot

[转帖]调试springboot数据库系统应用时常用debug日志配置, 解决问题缩小范围时常用

https://www.yihaomen.com/article/1853.html 摘要: 用 spring boot 开发应用时,在遇到麻烦问题时,经常会打开debug日志,下面记录一个通用的思路,基于spring boot以及jpa来实现, 一般来说,将root的日志级别设置为log.leve

3分钟带你搞定Spring Boot中Schedule

一、背景介绍 在实际的业务开发过程中,我们经常会需要定时任务来帮助我们完成一些工作,例如每天早上 6 点生成销售报表、每晚 23 点清理脏数据等等。 如果你当前使用的是 SpringBoot 来开发项目,那么完成这些任务会非常容易! SpringBoot 默认已经帮我们完成了相关定时任务组件的配置,

Springboot简单功能示例-6 使用加密数据源并配置日志

博主尝试通过gitee的发行版,使用Springboot为基础框架,逐步整合JWT、JPA、VUE等常用功能项目。【本节完成】配置logback;配置了数据源,对数据库账号密码进行加密;增加了系统启动配置

SpringBoot整合XXLJob

目录XXLJob简介特性模块安装调度中心初始化数据库配置启动整合执行器pomymlXxlJobConfig启动执行器实践简单的定时任务在执行器创建任务在调度中心创建执行器在调度中心创建任务带前置和后置处理的定时任务XxlJob注解详解创建带前(后)置处理的任务父子任务父子执行器关联父子任务执行器侧l