经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Spring Boot » 查看文章
Spring Boot 配置多数据源
来源:cnblogs  作者:Grey Zeng  时间:2022/12/2 11:03:50  对本文有异议

Spring Boot 配置多数据源

作者:Grey

原文地址:

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

CSDN:Spring Boot 配置多数据源

说明

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

环境和版本

Java 版本:17

Spring Boot 版本:3.0.0

数据库:H2

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

代码说明

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

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

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

schema.sql

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

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

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

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

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

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

foo 数据源的配置信息如下

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

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

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

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

另外一个 BarDataSourceConfig 同理。

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

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

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

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

  1. {ID=1, USER_NAME=grey-foo, EMAIL=abc@gmail.com}
  2. {ID=2, USER_NAME=jack-foo, EMAIL=jack@email.com}
  3. ----
  4. {ID=1, USER_NAME=grey-bar, EMAIL=abc@gmail.com}
  5. {ID=2, USER_NAME=jack-bar, EMAIL=jack@email.com}
  6. ----
  7. {ID=1, USER_NAME=grey-foo, EMAIL=abc@gmail.com}
  8. {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

原文链接:https://www.cnblogs.com/greyzeng/p/16938035.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号