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

使用 HikariCP 的连接超时

邹俊友
2023-03-14

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

minimumIdle: 1
maximumPoolSize: 10
leakDetectionThreshold: 30000

问题在于,我们的生产组件每隔几周就会反复抛出 SQLTransientConnectionException“连接不可用,请求在 30000 毫秒后超时...”。问题在于它永远不会从中恢复,并且会不断引发异常。因此,需要重新启动计算装置。

从HikariPool源代码来看,这似乎正在发生,因为每次它调用connectionBag.borrow(超时,毫秒)时,poolEntry都是空的,因此会抛出超时异常。要使其为空,连接池必须没有空闲条目,即 sharedList 中的所有 PoolEntry 都标记为IN_USE

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

我能想到的可能场景:

>

  • 所有条目均为<code>IN_USE</code>且数据库暂时关闭。我希望在进行中查询时抛出异常。此时,PoolEntry状态可能从未重置,因此在_USE中停留在<code>处。在这种情况下,我会认为,如果抛出异常,状态将更改,以便可以从池中清除连接。有人能证实情况是否如此吗?

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

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

    谢啦!

  • 共有1个答案

    金健
    2023-03-14

    场景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);
    
     类似资料:
    • 我已经掌握了java.sql。SQLTransientConnectionException:springHikariCP-连接不可用,请求在30001ms后超时。 第一个代码块工作良好,第二个(CP)不工作。 什么是错的,如何解决这个问题? JDK - 1.8.0_73。 HikariCP-2.4.5。 Spring4.2.5。释放。 大脑性麻痹

    • 我们的项目中有Spring-boot/hibernate/PostgreSQL应用程序,并使用Hikari作为连接池。我们不断遇到以下问题:几个小时后,活动连接数增长到极限,我们得到如下错误(完整堆栈跟踪位于问题的末尾): 以下是版本信息: JPA/Hibernate配置: HikariCP配置: 完整堆栈跟踪:

    • 我正在尝试使用hikaricp和java为Oracle数据库创建一个连接池。 这是我下面的代码。。 我正在降低误差。 任何建议也将是有益的..谢谢..

    • 这简化了代码返回以下错误: 很奇怪,因为服务器已经准备好并设置好了(http://localhost:9200/ 返回了一些json)。

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

    • 我正在开发一个在Java服务器上运行的游戏。对于数据库池,我使用的是HikariCP,这是一个优秀的库,但它现在抛出了以下错误: 现在我知道连接泄漏意味着打开的连接在某个地方漂浮,但我不知道如何或在哪里漂浮。 下面是我的数据库类中的一个方法,根据堆栈跟踪,错误应该发生在这里。 这只是启动语句的一个基本方法。调用它时,我使用它,然后调用、和 但它告诉我连接是打开的。 我怎么解决这个?谢了!