代码之家  ›  专栏  ›  技术社区  ›  anonuser1234

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

  •  0
  • anonuser1234  · 技术社区  · 4 年前

    我正在用一个定制的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());
        }
    }
    

    在我的申请中。属性,我有这些配置

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

    现在,这一切都在好的时候起作用,但问题是它不起作用的时候。例如,如果我输入了错误的密码,hikari会抛出连接池异常,但应用程序会继续运行。我希望应用程序失败,抛出异常并关闭,但我很难弄清楚这一点。我尝试添加另一个名为initializationFailTimeout的配置,如下所示 myConfig.datasource.initializationFailTimeout:5000 但同样的问题,我看到一个例外,但应用程序仍在运行。

    在hikari抛出连接异常时,如何使spring引导快速失败?

    谢谢

    0 回复  |  直到 4 年前
        1
  •  3
  •   amseager    4 年前

    我设法通过初始化来修复它 HikariConfig 先吃豆子,然后把它传给 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 因为初始化datasource会导致与您描述的完全相同的行为(应用程序会抛出一个关于错误密码的异常,但仍会继续启动)。我确认,只有当您没有自定义事务管理器时,它才会停止启动。

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