Java DB丢失时关闭弹簧 用例

Java DB丢失时关闭弹簧 用例,java,spring,hikaricp,Java,Spring,Hikaricp,我们的spring boot后端(2.3.1版)使用postgres数据库,HikariCP作为连接池。 应用程序处于联机状态,管理员意外终止了数据库 预期行为 Spring注意到与DB的连接已断开。应用程序将正常关闭 实际行为 春天还在继续。所有需要数据库的方法都以异常结束。 要恢复完全良好的状态,我们需要手动重新启动spring 注释 我们有很多异步工作者,当数据库重新联机时,他们无法正确恢复。 docker/kubernetes会注意到应用程序何时关闭并自动重新启动 问题 如何达到预期的行

我们的spring boot后端(2.3.1版)使用postgres数据库,HikariCP作为连接池。
应用程序处于联机状态,管理员意外终止了数据库

预期行为 Spring注意到与DB的连接已断开。应用程序将正常关闭

实际行为 春天还在继续。所有需要数据库的方法都以异常结束。
要恢复完全良好的状态,我们需要手动重新启动spring

注释
我们有很多异步工作者,当数据库重新联机时,他们无法正确恢复。
docker/kubernetes会注意到应用程序何时关闭并自动重新启动

问题 如何达到预期的行为?

不幸的是,我在网上没有发现类似的东西。

如果是spring 2.0,你可以从一些监控服务中调用关机执行器。

如果是spring 2.0,你可以从一些监控服务中调用关机执行器。

根据@Zubair的提示,我构建了一个新的小型解决方案。
我正在使用,因为他们有一些现成的类用于此用例

我所需要的只是一个
healthdindicator
-Bean,就像这样

@Bean
公共HealthIndicator数据源HealthIndicator(最终数据源数据源){
返回新的DataSourceHealthIndicator(dataSource,“选择1;”);
}
和计划观察者(因为HikariCP和HealthIndicators都没有任何事件)

@计划(固定速率=10000L)
public void checkDBHealth(){
最终状态状态=this.datasourcehealthdindicator.health().getStatus();
如果(!Status.UP.equals(Status)){
log.error(“数据库脱机!正在关闭!”);
系统出口(1);
}
}
我希望这对其他人有用

编辑 我必须更改HikariCP的配置。否则,运行状况检查程序几乎无休止地等待数据库连接

@Bean
公共数据源数据源(){
最终HikariConfig配置=新HikariConfig();
//用户、密码、jdbc等的默认设置。。。
config.setInitializationFailTimeout(1000);
config.setConnectionTimeout(1000);
config.setValidationTimeout(1000);
返回新的HikariDataSource(配置);
}

根据@Zubair的提示,我构建了一个新的小型解决方案。
我正在使用,因为他们有一些现成的类用于此用例

我所需要的只是一个
healthdindicator
-Bean,就像这样

@Bean
公共HealthIndicator数据源HealthIndicator(最终数据源数据源){
返回新的DataSourceHealthIndicator(dataSource,“选择1;”);
}
和计划观察者(因为HikariCP和HealthIndicators都没有任何事件)

@计划(固定速率=10000L)
public void checkDBHealth(){
最终状态状态=this.datasourcehealthdindicator.health().getStatus();
如果(!Status.UP.equals(Status)){
log.error(“数据库脱机!正在关闭!”);
系统出口(1);
}
}
我希望这对其他人有用

编辑 我必须更改HikariCP的配置。否则,运行状况检查程序几乎无休止地等待数据库连接

@Bean
公共数据源数据源(){
最终HikariConfig配置=新HikariConfig();
//用户、密码、jdbc等的默认设置。。。
config.setInitializationFailTimeout(1000);
config.setConnectionTimeout(1000);
config.setValidationTimeout(1000);
返回新的HikariDataSource(配置);
}

Hm。可以使用bean作为监视服务吗?您可以公开Rest端点,并且该功能可以由bean提供。我想是的,一个bean可以ping某个url/端点。看看你是否可以从中检查app/db的运行状况,并可以检查…如果运行状况不正常,请从执行器调用shudown端点…我建议查看执行器没有直接的方法?类似这样的事情:我做完了。感谢执行机构的建议,这很有帮助。:)嗯,可以使用bean作为监视服务吗?您可以公开一个Rest端点,该功能可以由bean提供。我想是的,一个bean可以ping某个url/端点。看看你是否可以从中检查app/db的运行状况,并可以检查…如果运行状况不正常,请从执行器调用shudown端点…我建议查看执行器没有直接的方法?类似这样的事情:我做完了。感谢执行机构的建议,这很有帮助。:)此外,提及您使用的执行器的maven依赖项……将对其他人有所帮助。此外,提及您使用的执行器的maven依赖项……将对其他人有所帮助。