2017-06-05 26 views
3

SpringブートアプリケーションでJDBC接続プールとしてHikariCPを使用します。私は2つのデータソースを持っています(MySQLデータベースをプライマリデータベースとして使用し、Hibernateを介してそれらのデータにアクセスし、さらにJDBCTemplateを介して他のデータを読み込むためのOracleデータベース)。SpringブートでHikariCPを使用する方法Flywayと組み合わせて2つのデータソースを使用する

私は主BeanとしてのMySQLデータソースを設定します。

@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ビーンの作成と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アプリケーションを実行する前に、つまり、create schemaはもう動作しません。

[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を作成します。これはさらに、光固有の設定で構成されています。

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 
関連する問題