HikariPool-1 - 连接不可用,对于非常小的负载服务器,请求在 30000 毫秒后超时

Posted

技术标签:

【中文标题】HikariPool-1 - 连接不可用,对于非常小的负载服务器,请求在 30000 毫秒后超时【英文标题】:HikariPool-1 - Connection is not available, request timed out after 30000ms for very tiny load server 【发布时间】:2018-05-25 06:44:32 【问题描述】:

我有一个用于测试的小型 Java 应用程序。我最近搬到了光。我注意到的是我不断收到此错误。

java.sql.SQLTransientConnectionException: HikariPool-1 - Connection is not available, request timed out after 30000ms.
java.sql.SQLTransientConnectionException: HikariPool-1 - Connection is not available, request timed out after 30000ms.
at com.zaxxer.hikari.pool.HikariPool.createTimeoutException(HikariPool.java:602)
at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:195)
at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:145)
at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:85)

以下是我最初对 hikari 的设置。

 HikariConfig config = new HikariConfig();
            config.setJdbcUrl("jdbc:mysql://localhost:3306/****"); 
            config.setUsername("***"); 
            config.setPassword("*****");      
            config.setMaximumPoolSize(20);  

我的两个设备几乎没有使用它,我确保在最后我确实关闭了它。所以我不知道为什么它不断收到错误?可能是什么问题,或者我需要更改一些设置?

我的 hikari 版本是 HikariCP-2.6.1.jar。

【问题讨论】:

请在您的问题中添加 hikari 版本和 hikari 的其他设置 我的 hikari 版本是 HikariCP-2.6.1.jar。除了上述问题中所述之外,我没有任何其他设置。谢谢。 【参考方案1】:

由于网络延迟或某些查询执行时间过长(超过 30000 毫秒),您的数据库未在(30000 毫秒,这是默认的 connectionTimeout 属性)内获得连接。

请尝试增加财产connectionTimeout的价值。

YML配置示例:

spring:
  datasource:
    hikari:
      minimumIdle: 2
      maximumPoolSize: 10
      idleTimeout: 120000
      connectionTimeout: 300000
      leakDetectionThreshold: 300000

Java 配置示例:

HikariConfig config = new HikariConfig();
        config.setMaximumPoolSize(20);
        config.setConnectionTimeout(300000);
        config.setConnectionTimeout(120000);
        config.setLeakDetectionThreshold(300000);

【讨论】:

假设我们所有的端点都在不到 2 秒的时间内运行,在尝试获取连接时还有什么可能导致超时?我们的应用程序作为 1 个实例运行良好,但一旦水平扩展,我们就会在所有新创建的应用程序中遇到这些错误。【参考方案2】:

我正在使用 Spring Boot,我遇到了同样的问题,我的解决方案是像这样“DataSourceUtils.getConnection(dataSource)”获得连接。所以我从dataSource.getConnection() 改为DataSourceUtils.getConnection(dataSource)

【讨论】:

您是如何初始化传递给 DataSourceUtils.getConnection(dataSource) 的“dataSource”参数的? 看,像这样:@Autowired private DataSource dataSource; 这个 SO 问题有更多关于原因的信息:***.com/questions/9642643/…【参考方案3】:

在我的情况下,代码没有关闭连接。

Try-with-resources 修复了它:

try (
    Connection connection = dataSource.getConnection();
    Statement statement = …
) 
…


【讨论】:

我怎么不明白你的意思?你用的是哪个java? 从 Java 7 开始尝试使用资源。 我对实体管理器做了同样的事情,同样的事情不同的颜色..【参考方案4】:

请求超时不是您可以通过增加超时来解决的问题。也许您需要评估服务中的所有查询并在需要时实施索引

【讨论】:

【参考方案5】:

花了很长时间才弄清楚...在我的情况下,我使用了类似于@Andres Rincon的解决方案:

try (Connection connection = DataSourceUtils.getConnection(jdbcTemplate.getDataSource())) 
    // some code here

【讨论】:

以上是关于HikariPool-1 - 连接不可用,对于非常小的负载服务器,请求在 30000 毫秒后超时的主要内容,如果未能解决你的问题,请参考以下文章

HikariPool-1 - Connection is not available, request timed out after XXXXms.

HikariPool连接池配置

HikariPool-1 - 无法验证连接 org.postgresql.jdbc.PgConnection@2a84e649(此连接已关闭。)

HikariPool-1 - Connection is not available, request timed out after,springboot如何设置连接池大小

com.zx.hikari.pool.HikariPool : HikariPool-1 - Exception during pool initialization. 报错问题

在 Azure 数据库中使用 OWIN 访问“错误:19 - 物理连接不可用”