2017-06-05 600 views
3

我想在我的Spring引導應用程序中使用HikariCP作爲JDBC連接池。我有兩個數據源(MySQL數據庫作爲主數據庫並通過Hibernate訪問這些數據,另外還有一個Oracle數據庫通過JDBCTemplate讀取一些其他數據)。如何在Spring Boot中使用HikariCP並將兩個數據源與Flyway結合使用

我設置了MySQL的數據源作爲主Bean:

@Bean 
@Primary 
@ConfigurationProperties("spring.datasource") 
public DataSourceProperties mySQLDataSourceProperties() { 
    return new DataSourceProperties(); 
} 


@Bean 
@Primary 
@ConfigurationProperties("spring.datasource") 
public DataSource mySQLDataSource() { 
    return mySQLDataSourceProperties().initializeDataSourceBuilder().build(); 
} 

@Bean 
@ConfigurationProperties("oracle.datasource") 
public DataSourceProperties oracleDataSourceProperties() { 
    return new DataSourceProperties(); 
} 

@Bean(name = "oracleDatabase") 
@ConfigurationProperties("oracle.datasource") 
public DataSource oracleDataSource() { 
    return oracleDataSourceProperties().initializeDataSourceBuilder().build(); 
} 

@Bean 
public JdbcTemplate oracleJdbcTemplate(@Qualifier("oracleDatabase") DataSource oracleDb) { 
    return new JdbcTemplate(oracleDb); 
} 

,我把下面的配置在我application.properties:

spring.datasource.type=com.zaxxer.hikari.HikariDataSource 

spring.datasource.hikari.minimum-idle=7 
spring.datasource.hikari.pool-name=Test-1 

spring.datasource.hikari.data-source-properties.prepStmtCacheSize=250 
spring.datasource.hikari.data-source-properties.prepStmtCacheSqlLimit=2048 
spring.datasource.hikari.data-source-properties.cachePrepStmts=true 
spring.datasource.hikari.data-source-properties.useServerPrepStmts=true 

Unforuntately,這些HikariCP配置沒有被讀取:

HikariConfig - dataSourceJNDI..................none 
HikariConfig - dataSourceProperties............{password=<masked>} 
HikariConfig - driverClassName................."com.mysql.jdbc.Driver" 
HikariConfig - healthCheckProperties...........{} 
HikariConfig - healthCheckRegistry.............none 
HikariConfig - idleTimeout.....................600000 
HikariConfig - initializationFailFast..........true 
HikariConfig - initializationFailTimeout.......1 
HikariConfig - isolateInternalQueries..........false 
HikariConfig - jdbc4ConnectionTest.............false 
HikariConfig - jdbcUrl........................."jdbc:mysql://localhost:3306/testDB" 
HikariConfig - leakDetectionThreshold..........0 
HikariConfig - maxLifetime.....................1800000 
HikariConfig - maximumPoolSize.................10 
HikariConfig - metricRegistry..................none 
HikariConfig - metricsTrackerFactory...........none 
HikariConfig - minimumIdle.....................10 
HikariConfig - password........................<masked> 
HikariConfig - poolName........................"HikariPool-1" 

創建HikariCP bean並停用DataSou RCE自動配置和刪除「spring.datasource」:

@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class}) 
@SpringBootApplication 
@ComponentScan 
public class SpringApplication { 


@Bean 
@Primary 
@ConfigurationProperties(prefix = "spring.datasource.hikari") 
public HikariConfig hikariConfig() { 
    return new HikariConfig(); 
} 

@Bean 
public DataSource dataSource() { 
    return new HikariDataSource(hikariConfig()); 
} 

解決我的問題:

HikariConfig - dataSourceJNDI..................none 
HikariConfig - dataSourceProperties............{password=<masked>, prepStmtCacheSqlLimit=2048, cachePrepStmts=true, useServerPrepStmts=true, prepStmtCacheSize=250} 
HikariConfig - driverClassName................."com.mysql.jdbc.Driver" 
HikariConfig - healthCheckProperties...........{} 
HikariConfig - healthCheckRegistry.............none 
HikariConfig - idleTimeout.....................600000 
HikariConfig - initializationFailFast..........true 
HikariConfig - initializationFailTimeout.......1 
HikariConfig - isolateInternalQueries..........false 
HikariConfig - jdbc4ConnectionTest.............false 
HikariConfig - jdbcUrl........................."jdbc:mysql://localhost:3306/testDB?autoReconnect=true" 
HikariConfig - leakDetectionThreshold..........0 
HikariConfig - maxLifetime.....................1800000 
HikariConfig - poolName........................"Test-1" 

但隨後的遷徙路線示出了以前沒有出一些奇怪的警告,我必須手動創建數據庫模式在運行Spring應用程序之前,即:創建模式不再起作用。

[WARN ] JdbcTemplate - DB: Can't create database 'test'; database exists (SQL State: HY000 - Error Code: 1007) 
[WARN ] JdbcTemplate - DB: Unknown table 'testSchema.tenant' (SQL State: 42S02 - Error Code: 1051) 
[WARN ] JdbcTemplate - DB: Unknown table 'testSchema.user' (SQL State: 42S02 - Error Code: 1051) 

我遷飛SQL腳本是普通的DDL腳本:

CREATE SCHEMA IF NOT EXISTS `testSchema` DEFAULT CHARACTER SET utf8 ; 

DROP TABLE IF EXISTS `testSchema`.`tenant`; 

CREATE TABLE `testSchema`.`tenant` (
    `id` int NOT NULL AUTO_INCREMENT, 

我認爲禁用自動配置數據源是不是最好的解決方案,因爲遷飛停止創建模式,並顯示警告。有沒有其他方法可以解決這個問題?

回答

3

聲明你自己的DataSource已經隱含的Spring Boot自動配置數據源。換句話說,這不會有任何影響:

@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class}) 

我認爲問題在於這樣一個事實,你也沒有約束力阿光特定的配置你的MySQL DataSource。你需要做這樣的事情:

@Bean 
@Primary 
@ConfigurationProperties("spring.datasource.hikari") 
public DataSource mySQLDataSource() { 
    return mySQLDataSourceProperties().initializeDataSourceBuilder().build(); 
} 

這將意味着你的mySQLDataSourceProperties與通用數據源配置配置。然後他們創建一個HikariDataSource,它進一步配置Hikari特定的配置。

0

謝謝你的快速和寶貴的答案安迪!你讓我走在正確的軌道上。摸索之後,我發現這個配置是爲我工作:

@Bean 
    @Primary 
    @ConfigurationProperties("spring.datasource") 
    //@ConfigurationProperties("spring.datasource.hikari") can also be used, no difference 
    public DataSourceProperties mySQLDataSourceProperties() { 
     return new DataSourceProperties(); 
    } 

    @Bean 
    @Primary 
    @ConfigurationProperties("spring.datasource.hikari") 
    public DataSource mySQLDataSource() { 
     return mySQLDataSourceProperties().initializeDataSourceBuilder().build(); 
    } 

    @Bean 
    @ConfigurationProperties(prefix = "spring.datasource.hikari") 
    public HikariConfig hikariConfig() { 
     return new HikariConfig(); 
    } 

    @Bean 
    public DataSource dataSource() { 
     return new HikariDataSource(hikariConfig()); 
    } 

,我不得不在application.properties添加這些設置:

# this is absolutely mandatory otherwise BeanInstantiationException in mySQLDataSource ! 
spring.datasource.url=${JDBC_CONNECTION_STRING} 

spring.datasource.hikari.jdbc-url=${JDBC_CONNECTION_STRING} 

spring.datasource.hikari.username=user 
spring.datasource.hikari.password=pass 
相關問題