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

标签 java spring spring-boot hikaricp fail-fast

我正在制作一个带有自定义 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 快速失败?

谢谢

最佳答案

我设法通过首先初始化 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 (我不使用 DataSourceAutoConfiguration.class 中的 spring.datasource.hikari >).

使用 DataSourceBuilder 初始化数据源会导致与您描述的行为完全相同(应用程序会抛出有关密码错误的异常,但仍会继续启动)。我确认仅当您没有自定义事务管理器等时它才会停止启动。

我正在使用 Spring Boot 2.1.9 和 HikariCP 3.2.0。

关于java - 当自定义事务管理器连接失败时,Spring Boot应用程序不会快速失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61190147/

相关文章:

java - 复合主键和数据截断错误

java - 在 Spring MVC 应用程序上获取空的 swagger UI

java - 使用纯spring java配置访问环境属性

java - 2 个 POST 请求处理程序(ResponseBody + "Normal")

java - 使用 Spring Boot 构建 Spring MVC 应用程序

java - JUnit 测试类失败测试

java - 如何使用 FileUploadPlugin 在 XWiki 中创建带有进度条的自定义 FileUpload

java - 如何使用 Spring Web Mvc 实现注销功能

spring-boot - Spring Boot JPA 无法添加自定义存储库

java - 如何在spring boot中使用应用程序上下文获取bean