2015-12-17 33 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的倉庫。