sam*_*sam 6 java jdbc spring-boot hikaricp
我有一个 Spring Boot (v2.0.8) 应用程序,它使用配置了以下内容的 HikariCP (v2.7.9) 池(连接到 MariaDB):
minimumIdle: 1
maximumPoolSize: 10
leakDetectionThreshold: 30000
Run Code Online (Sandbox Code Playgroud)
问题是我们的生产组件每隔几周就会反复抛出SQLTransientConnectionException " Connection is not available, request timed out after 30000ms...". 问题是它永远不会从中恢复并始终抛出异常。因此需要重新启动组件。
从查看 HikariPool 源代码来看,这似乎正在发生,因为每次它调用connectionBag.borrow(timeout, MILLISECONDS)poolEntry 时都是空的,因此会抛出超时异常。为使其为空,连接池必须没有空闲条目,即 sharedList 中的所有 PoolEntry 都被标记为IN_USE。
我不确定为什么该组件不会从中恢复,因为最终我希望标记一个 PoolEntryNOT_IN_USE并且这会破坏重复的异常。
我能想到的可能场景:
所有条目都是IN_USE,并且数据库暂时关闭。我希望为进行中的查询抛出异常。也许此时 PoolEntry 状态永远不会重置,因此停留在IN_USE. 在这种情况下,我会想如果抛出异常,状态会发生变化,以便可以从池中清除连接。任何人都可以确认是否是这种情况?
向组件发出大量 REST 请求,而这些请求又需要执行数据库查询。这会填满连接池,因此后续请求超时等待先前请求完成。这是有道理的,但是我希望组件在请求完成后恢复,但事实并非如此。
有没有人知道这里可能是什么问题?我曾尝试配置 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);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
20919 次 |
| 最近记录: |