2017-08-06 238 views
2

我正在配置兩個數據源,並嘗試設置池化屬性,並根據文檔我應該使用spring.datasource.tomcat。*,似乎並不適用於我正在做的配置。我究竟做錯了什麼?或者我錯過了什麼?Spring Boot不會選擇spring.datasource.tomcat。*,而以編程方式配置數據源?

我application.properties:

spring.datasource.tomcat.test-on-borrow=true 
spring.datasource.tomcat.validationQuery=SELECT 1 
spring.datasource.url=jdbc:mysql://localhost:3306/mydb 
spring.datasource.username 
spring.datasource.password 

spring.read.datasource.tomcat.test-on-borrow=true 
spring.read.datasource.tomcat.validationQuery=SELECT 1 
spring.read.datasource.url=jdbc:mysql://localhost:3306/mydb 
spring.read.datasource.username 
spring.read.datasource.password 

下面是我的配置類: 我有一個類似的讀取數據源(不同回購/實體)

@Configuration 
@EnableTransactionManagement 
@EnableJpaRepositories(entityManagerFactoryRef = "entityManagerFactory", 
transactionManagerRef = "transactionManager", 
basePackages = "com.test.feature.repo.internal") 
public class DataSourceConfig { 

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

    @Primary 
    @Bean(name="entityManagerFactory") 
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder, 
      @Qualifier("dataSource")DataSource dataSource){ 
     return builder.dataSource(dataSource).packages("com.test.feature.entity.internal").persistenceUnit("defaultPersistenceUnit").build(); 
    } 

    @Primary 
    @Bean(name="transactionManager") 
    public PlatformTransactionManager transactionManager(@Qualifier("entityManagerFactory") EntityManagerFactory entityManagerFactory){ 
     return new JpaTransactionManager(entityManagerFactory); 
    } 
} 

如果我嘗試使用spring.datasource.test-on-borrow = true,那麼這個工作。

我真的很想知道爲什麼.tomcat。*樣式不起作用?我能做些什麼來完成這項工作?

即使有人將我重定向到一些有用的閱讀材料,以瞭解這一點,我會很高興。 :)

+0

您正在使用哪個版本? –

+0

我正在使用1.5.4 –

+0

1.5.7中的情況與我相同。 DataSource沒有選擇'spring.datasource.tomcat。*'屬性。對我來說,即使spring.datasource.test-on-borrow = true也不起作用。 –

回答

1

該文檔是關於自動配置,你沒有使用它。如果您正在編寫自定義代碼來設置DataSource,則您也負責配置的綁定。

您的代碼上面有@ConfigurationPropeties("spring.datasource")。如果刪除它,則在您自己的代碼中將不會考慮spring.datasource.*屬性。

This section of the doc解釋了基本屬性(spring.datasource)和數據源綁定(spring.datasource.xyz.*)之間的差異。

無論如何,如果您自己創建DataSource(爲什麼?),則使用單獨的名稱空間。重命名spring.datasource命名空間相當混亂,因爲用戶期望自動配置提供的功能將得到遵守。而且他們不會因爲你正在編寫你自己的配置。

+0

然後如何配置多個數據源,以使池屬性不受影響。 (在這種情況下是tomcat jdbc池)。文檔不包括這個地方。 –

+0

該文檔涵蓋了完全(我在我的答案給了一個鏈接)。你看過嗎? –

+0

找到了。我錯過了連接屬性也可以在同一個命名空間中指定。謝謝你的幫助 –

0
  1. 如果你只有一個數據源和自動配置,你只需要使用spring.datasource。*來配置。 tomcatcp將被選作默認cp。

  2. 你的情況:配置兩個數據源編程方式,請添加以下注釋spring.datasource.typeapplication.properties告訴它你選擇哪種連接池。

spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource spring.read.datasource.type=org.apache.tomcat.jdbc.pool.DataSource