当前位置: 首页 > 知识库问答 >
问题:

数据库故障后Hikari CP(Spring Boot)连接恢复问题

束作人
2023-03-14

我们有几个基于Spring Boot (2.2.4)和光CP (3.4.2)和PostgreSQL的微服务。

最近,我们遇到了大约30秒的数据库故障。连接丢失后,一些容器无法恢复连接,而具有完全相同的配置和应用程序的其他容器则可以。遗憾的是,我们没有显示错误发生时池大小(空闲活动等待)的日志。

当连接丢失时,我们在所有容器上收到一些破裂管道和连接丢失错误。数据库恢复后,我们只在一些(2/18)无法恢复的容器上发现了以下异常。

堆栈跟踪:

org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:402)   ... 20 moreCaused by: 
java.sql.SQLTransientConnectionException: HikariPool-1 - Connection is not available, request timed out after 30000ms.  at
com.zaxxer.hikari.pool.HikariPool.createTimeoutException(HikariPool.java:689)   at
com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:196)    at 
com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:161)    at
com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:128) at 
org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122)    at 
org.hibernate.internal.NonContextualJdbcConnectionAccess.obtainConnection(NonContextualJdbcConnectionAccess.java:38)    at
org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.acquireConnectionIfNeeded(LogicalConnectionManagedImpl.java:104)  
... 30 moreCaused by:org.postgresql.util.PSQLException: This connection has been closed.    at 
org.postgresql.jdbc.PgConnection.checkClosed(PgConnection.java:857) at 
org.postgresql.jdbc.PgConnection.setNetworkTimeout(PgConnection.java:1639)  at 
com.zaxxer.hikari.pool.PoolBase.setNetworkTimeout(PoolBase.java:556)    at 
com.zaxxer.hikari.pool.PoolBase.isConnectionAlive(PoolBase.java:169)    at 
com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:185)    ... 35 more

我们已经看到了类似的(在同一系统上)情况和测试,其中数据库故障转移和连接在Hikari上恢复,没有任何问题。但在这种情况下,其中一个容器在 1 小时后自行还原,其他容器在重新启动后自行还原。

据我们所知,Hikari不会返回池中断开的连接,并在标记为断开或关闭后将它们从池中驱逐。任何关于这些容器可能发生什么的想法,而其他容器(完全相同的图像和配置)都很好。

PS:我们无法重现问题。

光配置:

允许池暂停.false
connectionInitSql没有
连接TestQuery.无
连接超时30000
空闲超时600000
初始化失败超时.......1
隔离内部查询假
泄漏检测阈值..........0
最大寿命最大 1800000
最大池大小...
15 最小值15
验证超时5000人

共有1个答案

柳飞飙
2023-03-14

您可以进行如下配置:

connectionTestQuery=select 1

通过这种方式,Hikari在将连接处理到Hibernate之前测试连接是否仍然处于活动状态。

 类似资料:
  • 本文向大家介绍Oracle ASM数据库故障数据恢复解决方案,包括了Oracle ASM数据库故障数据恢复解决方案的使用技巧和注意事项,需要的朋友参考一下 一、故障描述   ASM磁盘组掉线 ,ASM实例不能mount。ASM磁盘组有4个500G的磁盘组成,数据库和ASM软件为10.2.0.1,急需恢复oracle数据库。 二、故障分析   分析组成ASM磁盘组的磁盘,取出ASM元数据,对元数据进

  • 当我试图使用Spring Boot 2.2.1连接到DB2时。HikariCP池无法成功连接,但同时连接到JDBC。 null 附加的属性文件:

  • 我正在开发一个查询多个数据库的监控插件。我想使用HikariCP来保持连接打开,但我不知道如何实例化连接池。 HikariCP是否只使用一个池来存储多个数据库?或者一个数据库只有一个池,我的责任是实例化我将使用的数据库中的尽可能多的池。

  • 我正在尝试使用hikaricp和java为Oracle数据库创建一个连接池。 这是我下面的代码。。 我正在降低误差。 任何建议也将是有益的..谢谢..

  • 我正在运行spring boot,KafkaListener是我的客户。问题是我们如何从失败的kafka配置中恢复,并避免应用程序在退出代码为0的过程结束时停止。例如,不正确的配置可能是不正确的endpointurl。如果无法访问Kafka服务器,也会出现同样的情况。因此,在任何情况下,KafkaListner进程都不应该杀死服务器。 ontext.java:895应用程序上下文异常:未能启动be

  • 顺着我之前的一个问题,大部分评论都说“就是不要,你处于冷宫状态,你要杀光一切,重新开始”。还有一个“安全”的变通方法。 我不明白的是为什么分割错误本质上是不可恢复的。 写入受保护内存的时刻被捕获-否则,不会发送。 如果能够捕捉到写入受保护内存的时刻,我不明白为什么——理论上——它不能在某个低级别上恢复,并将SIGSEGV转换为标准软件异常。 请解释为什么在出现分段错误后,程序处于不确定状态,因为很