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

hikaricp - Spring Boot HikariCP 连接池频繁报错 Connection is not available 如何解决?

段干祺
2025-04-14

springboot采用默认连接池hikaricp,系统在线上运行后,经常会突然大批量报错:nested exception is org.apache.ibatis.exceptions.PersistenceException:
error-1001.log-### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.SQLTransientConnectionException: HikariPool-1 - Connection is not available, request timed out after 5009ms

数据库用的是Oracle 11g。

这种情况是偶然的,不是一直出现,一旦出现就会大批量报错。

我开启debug日志后,发现有如下错误:

  • Failed to validate connection oracle.jdbc.driver.T4CConnection@1c16e38e (关闭的连接). Possibly consider using a shorter maxLifetime value.
  • Closing connection oracle.jdbc.driver.T4CConnection@1c16e38e: (connection is dead)
  • Failed to validate connection oracle.jdbc.driver.T4CConnection@65814e22 (关闭的连接). Possibly consider using a shorter maxLifetime value.
  • Closing connection oracle.jdbc.driver.T4CConnection@65814e22: (connection is dead)

    • Failed to validate connection oracle.jdbc.driver.T4CConnection@739a232f (关闭的连接). Possibly consider using a shorter maxLifetime value.
  • Closing connection oracle.jdbc.driver.T4CConnection@739a232f: (connection is dead)

    • Failed to validate connection oracle.jdbc.driver.T4CConnection@1c0ea44b (关闭的连接). Possibly consider using a shorter maxLifetime value.
    • Closing connection oracle.jdbc.driver.T4CConnection@1c0ea44b: (connection is dead)
    • Failed to validate connection oracle.jdbc.driver.T4CConnection@402488c1 (关闭的连接). Possibly consider using a shorter maxLifetime value.
    • Closing connection oracle.jdbc.driver.T4CConnection@402488c1: (connection is dead)

    Timeout failure stats (total=31, active=0, idle=31, waiting=0)

我对连接池参数做出各种调整,比如调低maxLifetime,修改,均无作用。系统访问量很低,orm用的mybatis,每个接口的查询速度非常快。

共有1个答案

党博超
2025-04-14

看着是获取连接超时了,缩小一下minimum-idle,亦或是调小一下 idle-timeout

 类似资料:
  • 此刻我被困住的一点是调试处于“活动”状态的连接,以及它们正在做什么或它们当前被困的原因。 当我运行“10个同时用户”时,它基本上可以转换成2或3倍于此的查询,因此,当我打开HikariCP调试日志时,它会挂在类似的位置-上,而“active”连接并没有真正释放连接,这正是我试图找出的原因,因为查询相当简单,表本身只有4个字段(包括主键)。 HikariCP人员的最佳实践通常也是,增加连接池不是实现

  • 我正在使用HikariDataSource连接到MariaDB数据库。以下类返回一个。 这是执行select查询的方法。该类还包含一个close方法 try with块自动关闭对象,但如何关闭连接池?例如,我应该在数据库操作之后调用close方法吗 当我不调用方法时,我看不到任何关于关机启动的控制台输出。这是关闭和连接池的正确方法吗?

  • 我正在使用hikaricp(这可能也适用于任何其他数据库连接池)。我有一个DBPool类,在其中我实例化了一个HikariDataSource(使用HikariConfig对象)。对于这个DBPool,我使用lazyholder习惯用法来限制每个VM一个池实例。但是,一旦获得对池的引用,就可以检索连接对象(无需任何进一步的锁/同步/信号量检查),因为我认为连接池会处理我的连接对象限制。每次通过数据

  • 地狱, 我是否可以获取HKARIP连接池度量信息,如总连接数、空闲连接数等? 我知道Hikaripool记录这样的信息: 清理前池统计数据库(总计=20,使用次数=0,可用次数=20,等待次数=0) 但是它太频繁了,我的代码无法控制它。我想在可配置的时间内记录这些信息,例如1分钟。顺便说一句,我用Scala Slick 3.0

  • 我尝试使用HikariCP和mariaDB数据库,但是当我尝试初始化的时候,我得到了下一个错误。 由以下原因引起:com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure 我的MariaDBDatabase类: 我的数据库类: 我的家伙.xml

  • 我有这个使用HikariCP连接池的代码: 我通过发出命令“Show Processlist”来监控mysql中的连接,我看到在行之后创建了100个连接: 。。。正在运行。我肯定这不是命中注定的,对吧?它应该在稍后执行pooledDataSource时创建连接。getConnection()。 我做错了什么?为什么它会立即创建100个连接??

  • 我使用EclipseLink作为使用Play框架和Akka的应用程序的持久性提供程序。在play framework 2.3.x中,应用程序正常运行。现在我正在迁移到2.4.x,随后将迁移到2.5.x,但是当我从eclipse外部运行应用程序时遇到了一些问题: “没有名为Default的EntityManager的持久性提供程序”。 随着Play Framework连接池库从BoneCP更改为Hi

  • 我在配置文件中编写了以下属性我在运行项目时在应用程序中使用。 链接此处