首页 > 其他分享 >Spring Boot 配置多数据源

Spring Boot 配置多数据源

时间:2022-11-30 12:12:10浏览次数:61  
标签:bar 数据源 Boot datasource JdbcTemplate Spring foo USER

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', '[email protected]'),
    ('jack-foo', '[email protected]');

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

INSERT INTO USER_INFO (user_name, email)
VALUES ('grey-bar', '[email protected]'),
       ('jack-bar', '[email protected]');

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

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 protected]}
{ID=2, USER_NAME=jack-foo, [email protected]}
----
{ID=1, USER_NAME=grey-bar, [email protected]}
{ID=2, USER_NAME=jack-bar, [email protected]}
----
{ID=1, USER_NAME=grey-foo, [email protected]}
{ID=2, USER_NAME=jack-foo, [email protected]}

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

完整代码

spring-multi-datasource

参考资料

Spring Boot 2 Multiple Datasources initialize schema

Configure and Use Multiple DataSources in Spring Boot

标签:bar,数据源,Boot,datasource,JdbcTemplate,Spring,foo,USER
From: https://www.cnblogs.com/greyzeng/p/16938035.html

相关文章

  • springboot2 生产部署注意事项【持续更新】
    注意事项1.去除不需要的jar开发工具jar:springs-boot-devtools2.监控一定要做好权限制或者去除 控制jar:spring-boot-starter-actuator监控druid的监控......
  • SpringBoot2 使用Spring Session集群
    有几种办法:1.扩展指定server利用Servlet容器提供的插件功能,自定义HttpSession的创建和管理策略,并通过配置的方式替换掉默认的策略。缺点:耦合Tomcat/Jetty等Servlet容器,不能......
  • SpringBoot2 web
    验证框架SpringBoot支持JSR-303,Bean等验证框架JSR-303JSR-303是Java的标准验证框架,已有实现Hibernatevalidator.JSR-303验证类型空检查@Null验证对象是否为null@Not......
  • SpringBoot JWT
    JWT是一种鉴权机制,实现前后端分离登陆和权限的一种解决方式,用户在登陆之后后端生成token传到前端,以后每次的请求都携带着token到后端验证,如果过期或者失效就要求重新登陆......
  • Spring Boot + @Async 太好用了,助你大大提升 API 并发能力!
    来源:https://developer.aliyun.com/article/694020异步调用几乎是处理高并发Web应用性能问题的万金油,那么什么是“异步调用”?“异步调用”对应的是“同步调用”,同步调用......
  • 《Spring Boot 实战:从0到1》第1章 快速开始Hello World
    第1章快速开始HelloWorld大约20年前,程序员们使用“企业级JavaBean”(EJB)开发企业应用,需要配置复杂的XML。在二十世纪初期,新兴Java技术——Spring,横空出世。使用极简XML和P......
  • idea创建SpringBoot项目时,Type 选择 maven project 和maven pom 有什么区别?
    https://blog.csdn.net/bin_0203/article/details/121841615 在操作到Type选项时有四种项目类型可供选择:MavenProject(GenerateaMavenbasedprojectarchive)M......
  • 2022-12-30Spring-1
    1.静态资源配置原理SpringBoot启动默认加载xxxAutoConfiguration类(自动配置类)。SpringMVC功能的自动配置类WebMvcAutoConfiguration生效,给容器中配置了什么。配置文件......
  • 蓝牙AppLoader BootLoader升级指南
    一新旧Bootloader的区别在SiliconLabs的GeckoSDKv4.0版本之前,AppLoader是放在Gecko BootLoader和应用程序App之间的一个独立的程序。在GeckoSDKv4.1中,对于2系列......
  • 建立一个Springboot的测试环境
    /***Createdbyteston2022/09/310:29*/importcom.jeesite.modules.Application;importorg.junit.runner.RunWith;importorg.springframework.boot.test.......