Spring 启动 - 配置和初始化多个数据源
Spring Boot - Configure and initialise multiple datasources
我正在使用 Spring Boot 和 Liquibase 为我的项目初始化数据库。由于新的要求,我必须在两个不同的模式之间拆分我的数据库表。
我已经设法使用@Primary 注释为我的项目配置了两个数据源,但我想知道是否有办法分别初始化两个数据库,为每个数据库创建不同的表。
目前我只能使用我最初拥有的 liquibase yaml 脚本初始化我的主数据库
是的,在 Spring 中可以使用多个数据源或任何类型的 bean。只需要确保 Spring 能够识别哪个实例自动装配在哪里,所以基本上
- 使用 bean id
- 自动装配时使用@Qualifier
我设法使用两个 Liquibase bean 初始化了两个数据库。
在我的配置中 class 我有以下内容
@Bean
@Primary
@ConfigurationProperties("spring.datasource")
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "primaryLiquibaseProperties")
@ConfigurationProperties("liquibase-changelogs.primary.liquibase")
public LiquibaseProperties primaryLiquibaseProperties() {
return new LiquibaseProperties();
}
@Bean(name = "liquibase")
public SpringLiquibase primaryLiquibase(@Qualifier("primaryLiquibaseProperties") LiquibaseProperties liquibaseProperties) {
SpringLiquibase primary = new SpringLiquibase();
primary.setDataSource(dataSource());
primary.setChangeLog(primaryLiquibaseProperties().getChangeLog());
return primary;
}
@Bean(name = "metadata_datascource")
@ConfigurationProperties("spring.metadata_datascource")
public DataSource metadataDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "metadataLiquibaseProperties")
@ConfigurationProperties("liquibase-changelogs.metadate.liquibase")
public LiquibaseProperties metadataLiquibaseProperties() {
return new LiquibaseProperties();
}
@Bean(name = "metadata-liquibase")
public SpringLiquibase metadataLiquibase(@Qualifier("metadataLiquibaseProperties") LiquibaseProperties liquibaseProperties) {
SpringLiquibase metadata = new SpringLiquibase();
metadata.setDataSource(metadataDataSource());
metadata.setChangeLog(metadataLiquibaseProperties().getChangeLog());
return metadata;
}
在我的属性中我有:
spring:
datasource:
driver-class-name: org.postgresql.Driver
url: ...
username: abc
password: abc
jpa:
hibernate:
ddl-auto: update
metadata_datascource:
driver-class-name: org.postgresql.Driver
url: ...
username: abc
password: abc
jpa:
hibernate:
ddl-auto: update
liquibase-changelogs:
primary:
liquibase:
change-log: classpath:db/changelog/primary.yaml
metadata:
liquibase:
change-log: classpath:db/changelog/metadata.yaml
我正在使用 Spring Boot 和 Liquibase 为我的项目初始化数据库。由于新的要求,我必须在两个不同的模式之间拆分我的数据库表。
我已经设法使用@Primary 注释为我的项目配置了两个数据源,但我想知道是否有办法分别初始化两个数据库,为每个数据库创建不同的表。
目前我只能使用我最初拥有的 liquibase yaml 脚本初始化我的主数据库
是的,在 Spring 中可以使用多个数据源或任何类型的 bean。只需要确保 Spring 能够识别哪个实例自动装配在哪里,所以基本上
- 使用 bean id
- 自动装配时使用@Qualifier
我设法使用两个 Liquibase bean 初始化了两个数据库。 在我的配置中 class 我有以下内容
@Bean
@Primary
@ConfigurationProperties("spring.datasource")
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "primaryLiquibaseProperties")
@ConfigurationProperties("liquibase-changelogs.primary.liquibase")
public LiquibaseProperties primaryLiquibaseProperties() {
return new LiquibaseProperties();
}
@Bean(name = "liquibase")
public SpringLiquibase primaryLiquibase(@Qualifier("primaryLiquibaseProperties") LiquibaseProperties liquibaseProperties) {
SpringLiquibase primary = new SpringLiquibase();
primary.setDataSource(dataSource());
primary.setChangeLog(primaryLiquibaseProperties().getChangeLog());
return primary;
}
@Bean(name = "metadata_datascource")
@ConfigurationProperties("spring.metadata_datascource")
public DataSource metadataDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "metadataLiquibaseProperties")
@ConfigurationProperties("liquibase-changelogs.metadate.liquibase")
public LiquibaseProperties metadataLiquibaseProperties() {
return new LiquibaseProperties();
}
@Bean(name = "metadata-liquibase")
public SpringLiquibase metadataLiquibase(@Qualifier("metadataLiquibaseProperties") LiquibaseProperties liquibaseProperties) {
SpringLiquibase metadata = new SpringLiquibase();
metadata.setDataSource(metadataDataSource());
metadata.setChangeLog(metadataLiquibaseProperties().getChangeLog());
return metadata;
}
在我的属性中我有:
spring:
datasource:
driver-class-name: org.postgresql.Driver
url: ...
username: abc
password: abc
jpa:
hibernate:
ddl-auto: update
metadata_datascource:
driver-class-name: org.postgresql.Driver
url: ...
username: abc
password: abc
jpa:
hibernate:
ddl-auto: update
liquibase-changelogs:
primary:
liquibase:
change-log: classpath:db/changelog/primary.yaml
metadata:
liquibase:
change-log: classpath:db/changelog/metadata.yaml