HikariCP 的连接超时

Posted

技术标签:

【中文标题】HikariCP 的连接超时【英文标题】:Connection timeouts with HikariCP 【发布时间】:2019-10-27 09:33:52 【问题描述】:

我有一个 Spring Boot (v2.0.8) 应用程序,它使用了 HikariCP (v2.7.9) 池(连接到 MariaDB),配置如下:

minimumIdle: 1
maximumPoolSize: 10
leakDetectionThreshold: 30000

问题是我们的生产组件每隔几周就会重复抛出SQLTransientConnectionException " Connection is not available, request timed out after 30000ms..."。问题是它永远不会从中恢复并始终抛出异常。因此需要重新启动组件。

通过查看 HikariPool 源代码,似乎正在发生这种情况,因为每次调用 connectionBag.borrow(timeout, MILLISECONDS) 时 poolEntry 为 null 并因此引发超时异常。要使其为空,连接池必须没有空闲条目,即 sharedList 中的所有 PoolEntry 都标记为IN_USE

我不确定为什么组件不能从中恢复,因为最终我希望将 PoolEntry 标记为 NOT_IN_USE,这会破坏重复的异常。

我能想到的可能场景:

    所有条目都是IN_USE,并且数据库暂时关闭。我希望为进行中的查询抛出异常。也许此时 PoolEntry 状态从未重置,因此停留在IN_USE。在这种情况下,我会认为如果抛出异常,则状态会更改,以便可以从池中清除连接。任何人都可以确认是否是这种情况?

    向组件发出大量 REST 请求,而这些请求又需要执行 DB 查询。这会填满连接池,因此后续请求会超时,等待之前的请求完成。这是有道理的,但是我希望组件在请求完成后恢复,但事实并非如此。

有没有人知道这里可能存在什么问题?我已尝试配置 Hikari 文档中的各种超时,但没有运气诊断/解决此问题。任何帮助将不胜感激。

谢谢!

【问题讨论】:

您好,我们环境中的相同场景。 您是否知道释放少量连接后组件无法自动恢复的原因? 【参考方案1】:

情景 2 很可能是正在发生的事情。在将它与云数据流一起使用并接收大量连接请求时,我遇到了同样的问题。我找到的唯一解决方案是使用配置来找到适合我用例的组合。

我的代码每秒可处理 50-100 个请求,祝你好运。

private static DataSource pool;
final HikariConfig config = new HikariConfig();
config.setMinimumIdle(5);
config.setMaximumPoolSize(50);
config.setConnectionTimeout(10000);
config.setIdleTimeout(600000);
config.setMaxLifetime(1800000);
config.setJdbcUrl(JDBC_URL);
config.setUsername(JDBC_USER);
config.setPassword(JDBC_PASS);

pool = new HikariDataSource(config);

【讨论】:

谢谢,这是避免超时的好方法。不过,小评论:空闲超时和最大生命周期值似乎是每个 github.com/brettwooldridge/HikariCP#configuration-knobs-baby 的默认值 但是这个问题仍然没有答案,为什么用户需要重新启动组件?一旦有少量连接空闲,系统应该开始处理传入请求。

以上是关于HikariCP 的连接超时的主要内容,如果未能解决你的问题,请参考以下文章

一定数量的查询后 HikariCP 连接超时错误

HikariPool-1 - 连接不可用,请求超时

springboot升级最新版,报数据库连接超时

HikariCP - MYSQL 连接关闭后不允许操作。可能考虑使用更短的 maxLifetime 值

高并发的MySQL数据查询时,会不会选择数据库连接池?

TFTP连接超时