Spring Boot 配置多数据源
创始人
2024-03-04 01:46:23

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

相关内容

热门资讯

demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...