2015-12-17 37 views
3

我有一个安装我的弹簧web应用程序,其中有两个数据源,主数据源和辅助数据源。这两个数据源主要共享除用户名,密码和url之外的所有配置属性。随着公共属性列表的增长,我希望为这两个数据源使用通用配置属性,并且只指定为次要数据源和其他数据源重写哪些属性。例如,我有我的设置主要数据来源豆这样的:带重复属性的Spring引导多个数据源

@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

是否有可能注入重复属性,如驱动程序名称和其他人,而只指定重写?像这样的东西(这不起作用):

@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(); 
} 

编辑:

我已经更换了我的属性文件,以.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 
@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(); 
} 

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

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

EDIT2: 一些澄清,对我们的设置,我们有当前的属性文件:

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

两个临时和生产环境必须使用两个数据源,所以分期有两个数据源(主,辅)并且生产有两个数据源(主要的,次要的)。主数据源和辅助数据源之间共享驱动程序等设置以及其他数据。尝试将这些公共属性注入第二个数据源时出现问题。

回答

1

我建议将Spring配置文件与YAML配置结合使用(如果可能,但它适用于属性文件)。

// Insert in your Spring Configuration Class 

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

    @Profile("production") 
    @ConfigurationProperties(prefix = "spring.datasource") 
    @Bean 
    public DataSource secondDataSource() { 
     return DataSourceBuilder 
     .create() 
     .url(databaseUrl) // Override url 
     .username(username) // Override username 
     .password(password) // Override password 
     .build(); 
    } 

如果您使用适当的配置文件(例如,第二个(请参阅http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-profiles.html),然后加载正确的DataSource。默认配置文件不需要spring.profiles.active值集。

编辑:

没有必要创建额外的配置文件或文件。 提醒:您可以通过-Dspring.profiles.active="production"设置默认配置文件。如果没有设置默认配置文件,那么它是default,您不必创建/定义它。

好了,回到主题:

比方说,你想用一个“生产”和“做”的个人资料工作,激活每一个配置文件配置。 您可以通过在第一个bean与 @Profile("default", "production")更换@Profile("default")做古典像上面。 在第二个bean中,将@Profile("second")替换为@Profile("staging")

另一种方式是通过逻辑运算符来做到这一点。 对于“生产”配置文件,您想要使用用户名/密码数据源。 所以这里需要一个@Profile("production")注解。 对于非生产性使用(你的情况staging),你可以使用@profile(!“生产”)。

尼斯阅读: https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/annotation/Profile.html

EDIT2:

对于一个性能/ YAML文件的解决方案,我会去下面的办法:

# application.yml 
# default settings 
spring: 
    datasource: 
    # insert your default settings 
--- 
spring: 
    profiles: staging 
    datasource: 
    # insert staging settings here 
--- 
spring: 
    profiles: production 
    datasource: 
    # insert production settings here 

这样可以节省额外的每个配置文件的属性文件。

+0

我忘了补充一点,我们已经建立了几个配置文件,一个用于临时和生产,我觉得有几个配置文件将局势更加复杂化。我想要实现的是减少配置文件和属性。 – Edd

+0

我测试过了你的建议,但我不能让它与.yml配置文件时,可能为时已晚......一开始我想用一个单一的属性文件去关闭,只是注入主数据源属性转换为辅助数据源配置类或沿着这些行的某些内容以避免创建多个文件。对于多个配置文件,我们根据凡申请是通过上.properties文件运行的服务器,为你的要求.yml – Edd

+0

加入进一步的解释只是使用一个配置文件,因此不喜欢设置环境 – mchlfchr

0

最后得到了与这两个数据源的重复使用性能这方面的工作。首先我创建了一个豆来存储这些共同特性:按值

@Configuration 
public class CommonPropertiesConfiguration { 

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

而在第二数据源的配置我自动装配的共同属性(所有数据源属性),并注入此数据源特定性质:

而且现在的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 

的变化也反映在GitHub的仓库。