gpt4 book ai didi

java - 具有重复属性的 Spring Boot 多个数据源

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:16:45 24 4
gpt4 key购买 nike

我设置了我的 spring web 应用程序,其中有两个数据源,主要数据源和次要数据源。这两个数据源除了用户名、密码和 url 之外,大部分都共享所有配置属性。随着公共(public)属性列表的增加,我想对两个数据源都使用公共(public)配置属性,并且只指定要覆盖辅助数据源和其他数据源的配置属性。例如,我已经像这样设置了我的主要数据源 bean:

@Bean
@Primary
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}

在辅助数据源中:

@Value("${spring.secondaryDatasource.url}")
private String databaseUrl;

@Value("${spring.datasource.username}")
private String username;

@Value("${spring.datasource.password}")
private String password;

@Value("${spring.datasource.driver-class-name}")
private String driver;

@Bean
public DataSource secondaryDataSource() {
return DataSourceBuilder
.create()
.url(databaseUrl)
.username(username)
.password(password)
.driverClassName(driver)
.build();
}

我还设置了一个与我当前设置类似的示例项目: https://github.com/Edvinas01/MultipleDatasources

是否可以在仅指定要覆盖的属性的同时注入(inject)重复的属性,例如驱动程序名称和其他属性?像这样的东西(这不起作用):

@Bean
@ConfigurationProperties(prefix = "spring.datasource") // Inject default properties
public DataSource secondaryDataSource() {
return DataSourceBuilder
.create()
.url(databaseUrl) // Override url
.username(username) // Override username
.password(password) // Override password
.build();
}

编辑:

我已将 .properties 文件替换为 .yml 配置文件,如下所示:

spring:
jpa.hibernate.ddl-auto: update
datasource:
username: main
password: main
url: jdbc:hsqldb:mem:main
driver-class-name: org.hsqldb.jdbc.JDBCDriver

---

spring:
profiles: secondary
datasource:
username: secondary
password: secondary
url: jdbc:hsqldb:mem:secondary

---

spring:
profiles.active: default,secondary

和数据源bean:

@Bean
@Primary
@Profile("default")
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}

@Bean
@Profile({"secondary", "default"})
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource secondaryDataSource() {
return DataSourceBuilder.create().build();
}

我的主要数据源(默认)获取次要数据源值,但次要配置文件配置中未指定的驱动程序除外。而辅助数据源获取正确的属性。

在不使用 .yml 格式进行配置或不必为每个配置文件创建多个 .applications 文件的情况下,是否有可能的解决方案?

编辑2:澄清一下,在我们的设置中,我们有当前的属性文件:

application.properties (sets the active profile according to the machine and common properties)
application-stating.properties (staging machine)
application-production.properties (production machine)

暂存和生产环境都必须使用两种数据源,因此暂存有两个数据源(主要、次要),生产有两个数据源(主要、次要)。主数据源和辅助数据源之间共享驱动程序等设置和其他一些设置。尝试将这些通用属性注入(inject)第二个数据源时会出现问题。

最佳答案

终于可以使用两个数据源的可重用属性。首先,我创建了一个 bean 来存储这些公共(public)属性:

@Configuration
public class CommonPropertiesConfiguration {

@Bean
@ConfigurationProperties(prefix = "spring.datasource")
public PoolProperties poolProperties() {
return new PoolProperties();
}
}

在第二个数据源配置中,我 Autowiring 公共(public)属性(所有数据源属性)并按值为此数据源注入(inject)特定属性:

@Value("${spring.secondaryDatasource.username}")
private String username;

@Value("${spring.secondaryDatasource.password}")
private String password;

@Value("${spring.secondaryDatasource.url}")
private String url;

@Autowired
private PoolProperties poolProperties;

@Bean
public DataSource secondaryDataSource() {
DataSource dataSource = new DataSource(poolProperties);
dataSource.setPassword(password);
dataSource.setUsername(username);
dataSource.setUrl(url);
return dataSource;
}

现在 application.properties 看起来像这样:

# Main/common data source properties.
spring.datasource.username=test
spring.datasource.password=test

spring.datasource.url=jdbc:hsqldb:mem:main
spring.datasource.driver-class-name=org.hsqldb.jdbc.JDBCDriver

# Override these properties for second datasource.
spring.secondaryDatasource.username=second
spring.secondaryDatasource.password=second
spring.secondaryDatasource.url=jdbc:hsqldb:mem:secondary

logging.level.com.datasources=DEBUG
spring.jpa.hibernate.ddl-auto=update

更改也会反射(reflect)在 github 存储库中。

关于java - 具有重复属性的 Spring Boot 多个数据源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34338468/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com