当自定义事务管理器无法连接时,Spring Boot应用程序不会快速失败

问题描述 投票:2回答:1

我正在使用具有自己的数据源的自定义transactionManager制作Spring Boot应用程序,如下所示。顺便说一句,我正在使用hikariCP作为数据源

@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());
    }
}

在我的application.properties中,我具有以下配置

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

现在,当一切正常时,所有方法都可以使用,但是问题在于何时无法使用。例如,如果我输入了错误的密码,hikari会引发连接池异常,但该应用程序将继续运行。我希望该应用程序失败,引发异常并关闭,但是我无法确定该错误。我尝试添加另一个名为initializationFailTimeout的配置,例如myConfig.datasource.initializationFailTimeout:5000,但同样的问题,我看到一个异常,但应用程序仍在运行。

关于hikari抛出连接异常时如何使spring boot快速失败的任何方法?

谢谢

java spring spring-boot hikaricp fail-fast
1个回答
3
投票

我设法通过首先初始化HikariConfig bean来解决它,然后将其传递给HikariDataSource构造函数:

@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);
}

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

请注意,所有这些属性仅带有前缀spring.datasource(我不使用spring.datasource.hikari中的DataSourceAutoConfiguration.class)。

使用DataSourceBuilder初始化数据源将导致与您所描述的行为完全相同的行为(该应用会引发有关错误密码的异常,但仍会继续启动)。我确认只有当您没有自定义交易管理器时,它才会停止启动。

我正在使用带有HikariCP 3.2.0的Spring Boot 2.1.9。

© www.soinside.com 2019 - 2024. All rights reserved.