2

I am making a spring boot app with a custom transactionManager with its own datasource like so. Btw I'm using hikariCP as the datasource

@Configuration
@EnableTransactionManagement
@EnableJpaRespositories(
basePackages = "..."
entityManagerFactoryRef = "..."
transactionManagerRef = "..."
)
public class myDataSourceConfigration {
    @Bean
    @Primary
    @Configuration("myconfig.datasource")
    public DataSourceProperties myconfigDataSourceProperties() {
        return new DataSourceProperties();
    }

    @Bean
    @Primary
    @Configuration("myconfig.datasource.configurations")
    public DataSource myconfigDataSource(){
        return myconfigDataSourceProperties().initializeDataSourceBuilder().type(HikariDataSource.class).build;
    }

    @Bean
    @Primary
    public LocalContainerEntityManagerFactoryBean myconfigEntityManagerFactory(EntityManagerFactoryBuilder builder){
        return builder                
                 .dataSource(myconfigDataSource)
                 .packages(MyClass.class)
                 .build;
    }

    @Bean
    @Primary
    public PlatformTransactionManager myconfigTransactionManager(
             final @Qualifier ("myconfigEntityManagerFactory")LocalContainerEntityManagerFactoryBean myconfigEntityManagerFactory){
        return new JpaTransactionManager(myconfigEntityManagerFactory.getObject());
    }
}

In my application.properties, I have these configurations

myconfig.datasource.url:url
myconfig.datasource.username:username
myconfig.datasource.password:password
myconfig.datasource.driverClassName:driverClass

Now this all works when its fine but the issue is when it doesn't work. For example, if I put the wrong password, hikari throws a connection pool exception but the app keeps running. I want the app to fail, throw an exception and shutdown but I am having trouble figuring that out. I tried adding another configuration called initializationFailTimeout like so myConfig.datasource.initializationFailTimeout:5000 but same issue, I see an exception but the app keeps running.

Anyway on how to make spring boot fail fast when hikari throws a connection exception?

Thanks

anonuser1234
  • 511
  • 2
  • 11
  • 24

1 Answers1

3

I managed to fix it by initializing HikariConfig bean first and then pass it into HikariDataSource constructor:

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

@Bean("myDatasource")
public DataSource myDataSource(@Qualifier("myDatasourceHikariConfig") HikariConfig hikariConfig) {
    return new HikariDataSource(hikariConfig);
}

The corresponding part of application.properties:

spring.datasource.jdbc-url: jdbc-url
spring.datasource.username: username
spring.datasource.password: WRONG
spring.datasource.driver-class-name: driver
spring.datasource.type: com.zaxxer.hikari.HikariDataSource

#Following are hikari specific properties
spring.datasource.initializationFailTimeout: 5000
spring.datasource.maximum-pool-size: 10
spring.datasource.minimum-idle: 1
spring.datasource.connection-timeout: 30000
spring.datasource.pool-name: datasource-pool

Note that all these properties are just with prefix spring.datasource (I don't use spring.datasource.hikari from DataSourceAutoConfiguration.class).

Using DataSourceBuilder for initializing datasource leads to exactly the same behavior as you described (the app throws an exception about the wrong password but continue to launch nevertheless). I confirm that it stops launching only when you don't have custom transaction manager etc.

I'm using Spring Boot 2.1.9 with HikariCP 3.2.0.

amseager
  • 5,795
  • 4
  • 24
  • 47
  • Thanks! This worked perfectly. I had no idea it was the way I was constructing my datasource beans. Going to update my question to include these – anonuser1234 Apr 13 '20 at 16:16