【问题标题】:Hikari connection pool, Connection is not availableHikari 连接池,连接不可用
【发布时间】:2026-02-03 14:40:01
【问题描述】:

是的,经过多年的设计分析和思考同样的问题.. 我知道这是设计问题。正如评论员所说。给 Hikari 提供数千个连接并不意味着数据库将处理数千个连接请求。 因此必须将设计更新为最佳数据库连接,并且线程必须等待下一个可用连接。如果您的线程没有及时完成并且仍然在几分钟,几小时内工作..那么您正在做什么以提供与其他线程的数千个连接。这是错误的!完全错误! 给数千个线程连接并不意味着一切都已解决。如果您认为我们有出色的表现:) 那是失败的成功。

我有线程系统。 7000个线程处理一些复杂的任务。

我们有 java 解决方案:spring、hibernate 用于持久性、log4j2、hikari 连接池用于 db 访问(它使用 bean 加载和管理)

我之前将 Hikari 连接池大小设置为线程大小的 %30。但我们得到了这个 连接不可用,请求在 30025 毫秒后超时... 错误。在此错误之后,我无法修复服务停止。我尝试将数据库池大小增加到 8000。

所以线程大小是:7000,数据库池大小是:8000..

但我得到这个错误出乎意料。发生了什么?有人可以解释为什么 db 连接不支持此服务吗?

我读到大多数用户使用最小化池大小(例如 20.000 线程但只有 20 db 池大小)运行他们的服务。怎么可能做到?你能解释一下,我的服务设计问题是什么。

是的,我有@Transactional 注释,并且在复杂任务中的许多功能上都需要新功能。那里有问题吗?重点是这个?

你能帮我找出主要问题是什么吗?

org.springframework.transaction.CannotCreateTransactionException: Could not open JPA EntityManager for transaction; nested exception is org.hibernate.exception.JDBCConnectionException: Unable to acquire JDBC 

Connection at org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:431)

Caused by: org.hibernate.exception.JDBCConnectionException: Unable to acquire JDBC Connection

Caused by: java.sql.SQLTransientConnectionException: springHikariCP - Connection is not available, request timed out after 30025ms.

Caused by: java.sql.SQLException: Network error IOException: Address already in use: connect

Caused by: java.net.BindException: Address already in use: connect

【问题讨论】:

  • a) 您是否close() 连接并在完成后将其返回到池中? b) 此堆栈跟踪显示 BindException。我不确定这在客户端是怎么发生的,你的 tcp 端口用完了吗?

标签: java spring hibernate transactions hikaricp


【解决方案1】:

仅仅因为您允许程序同时使用数千个与数据库的连接,并不意味着数据库可以处理它们。这就是为什么在一段时间后增加连接会适得其反(在数十或可能数百个连接中)。

您可以配置等待空闲连接的超时时间(在您的示例中为 30 秒),但这并不能改变这样一个事实,即如果您尝试在规模不大的服务器上做很多事情,您将有麻烦了。

获取更大的数据库(或横向扩展)、使用更少的线程或尝试在数据库中找到可以优化的性能热点。

【讨论】: