Spring 当自定义事务管理器连接失败时,启动应用程序不会快速失败
Spring boot app will not fail fast when custom transaction manager fails to connect
我正在制作一个 spring 启动应用程序,它带有自定义的 transactionManager,它有自己的数据源,就像这样。顺便说一句,我使用 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 启动快速失败?
谢谢
我设法通过先初始化 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。
我正在制作一个 spring 启动应用程序,它带有自定义的 transactionManager,它有自己的数据源,就像这样。顺便说一句,我使用 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 启动快速失败?
谢谢
我设法通过先初始化 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。