Spring Boot 配置多数据源

news/2025/1/1 10:37:49/

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 INTOUSER_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 {@Beanpublic PlatformTransactionManager fooTxManager(DataSource fooDataSource) {return new DataSourceTransactionManager(fooDataSource);}@Beanpublic DataSourceProperties fooDataSourceProperties() {return new DataSourceProperties();}@Bean@Primarypublic DataSource fooDataSource() {DataSourceProperties dataSourceProperties = fooDataSourceProperties();// schema initDatabasePopulator 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@Primarypublic 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;}@Overridepublic 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


http://www.ppmy.cn/news/595.html

相关文章

半正定Toeplitz矩阵的范德蒙德分解

半正定Toeplitz矩阵的范德蒙德分解 Toeplitz矩阵的定义:Matrices whose entries are constant along each diagonal are called Toeplitz matrices. 形如 T[r0r1r2r3r−1r0r1r2r−2r−1r0r1r−3r−2r−1r0](1)\boldsymbol{T}\left[ \begin{matrix} r_0& r_1&…

概率论与数理统计——事件间的关系

包含 事件A发生必然导致事件B发生。 代数中经常用这种方法证明两个事件相等。 事件的并(和) A与B至少有一个发生 事件的交(积) A与B同时发生 无限可列个:能按某种规律能把他排成一个序列(实变函数…

Linux学习-66-系统日志管理

15 Linux系统日志管理 系统日志详细地记录了在什么时间,哪台服务器、哪个程序或服务出现了什么情况。不管是哪种操作系统,都详细地记录了重要程序和服务的日志,只是我们很少养成查看日志的习惯。 日志是系统信息最详细、最准确的记录者&…

centos7磁盘扩容(虚拟机Mac m1)

为了安装HDP3.1.4(Ambari2.7.4)弄了三台虚拟机,但安装完mysql和操作完前期准备后,上传ambari,HDP,HDP-UTILS安装包时,磁盘居然不够了,又是一顿折腾...... 第一种在原来磁盘上扩大存储 1.虚拟机磁盘大小设…

​SAP MM 使用两个STO实现免关税跨国公司间转储

​SAP MM 使用两个STO实现免关税跨国公司间转储 SAP项目实践中常常会有这样的场景:某个集团公司在多个国家有工厂和分销中心。制造工厂一般在发展中国家,分销中心设立在欧美国家。制造工厂把生产好的成品发往欧美的分销中心,然后由分销中心销…

围观大神的代码,提高一下精气神

前言 互联网很多大佬都是从写代码起家的,像马化腾、丁磊、雷军、张小龙、张一鸣等人,无不是从一行行代码里敲出的天下。他们那个年代,编程语言基本是C或汇编,github没有兴起,连sourceforge都还没出现(张一鸣年代除外)…

java+jsp基于ssm汽车配件管理系统-计算机毕业设计

项目介绍 本汽车配件管理系统是针对目前网上车企的实际需求,从实际工作出发,对过去的汽车配件管理系统存在的问题进行分析,结合计算机系统的结构、概念、模型、原理、方法,在计算机各种优势的情况下,采用目前最流行的…

基于stm32的智能药盒

提示:记录2022年4月做的毕设 文章目录前言一、任务书1.1设计(研究)目标:1.2设计(研究)内容:二、框架思路三、硬件四、联系我们五、相关功能介绍六、喜欢请点赞哦!前言 基于STM32的智能药盒,主控使用STM32F103(正点原子战舰板子&a…