Spring Boot 配置多数据源
作者:互联网
代码说明
首先,配置两个数据源,这里我们基于 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"));