繁体   English   中英

与HikariCP的连接超时

[英]Connection timeouts with HikariCP

我有一个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,因此会抛出超时异常。 如果它为null,则连接池必须没有空闲条目,即sharedList中的所有PoolEntry都标记为IN_USE

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

我能想到的可能场景:

  1. 所有条目都是IN_USE ,DB暂时中断。 我希望在飞行中查询会抛出异常。 也许在这一点上,PoolEntry状态永远不会被重置,因此会停留在IN_USE 在这种情况下,我会想到如果抛出异常,状态会发生变化,以便可以从池中清除连接。 任何人都可以确认是否是这种情况?

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

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

谢谢!

场景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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM