Java 与HikariCP的连接超时

Java 与HikariCP的连接超时,java,spring-boot,jdbc,hikaricp,Java,Spring Boot,Jdbc,Hikaricp,我有一个Spring Boot(v2.0.8)应用程序,它使用一个HikariCP(v2.7.9)池(连接到MariaDB),配置有: minimumIdle: 1 maximumPoolSize: 10 leakDetectionThreshold: 30000 问题是,我们的生产组件每隔几周就会反复抛出SQLTransientConnectionException“连接不可用,请求在30000ms后超时…”。问题是,它永远不会从中恢复,并始终抛出异常。因此,需要重新启动组件 从Hikari

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

minimumIdle: 1
maximumPoolSize: 10
leakDetectionThreshold: 30000
问题是,我们的生产组件每隔几周就会反复抛出
SQLTransientConnectionException“连接不可用,请求在30000ms后超时…”
。问题是,它永远不会从中恢复,并始终抛出异常。因此,需要重新启动组件

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

我不确定为什么该组件不能从中恢复,因为最终我会期望一个PoolEntry被标记为
not\u IN\u USE
,这将打破重复的异常

我能想到的可能情景:

  • 所有条目都在使用中,数据库暂时关闭。我希望为飞行中的查询抛出异常。此时,PoolEntry状态可能永远不会重置,因此在使用中会停留在
    。在这种情况下,我会认为如果抛出异常,状态将更改,以便可以从池中清除连接。有人能证实这是不是真的吗

  • 向组件发出大量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);
    

    您好,在我们的环境中也是这样。谢谢,这是避免超时的一个很好的指针。。不过有一点小评论:空闲超时值和最大生存期值似乎是每分钟的默认值