2017-06-05 112 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 
相关问题