27

我有一个用于测试目的的小型 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。

4

6 回答 6

21

由于网络延迟或某些查询执行时间过长(超过 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);
于 2019-08-25T16:33:24.607 回答
7

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

于 2020-08-08T12:28:02.937 回答
5

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

Try-with-resources 修复了它:

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

于 2021-06-24T04:38:55.727 回答
2

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

于 2021-09-22T13:54:35.643 回答
1

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

try (Connection connection = DataSourceUtils.getConnection(jdbcTemplate.getDataSource())) {
    // some code here
}
于 2021-08-03T13:30:45.940 回答
0

如果客户端应用程序请求大量打开的连接并且数据库服务器设置对池连接数有最大限制,也会发生这种情况。因此客户端应用程序无法从数据库服务器获得更多连接。检查数据库服务器连接池以查看在错误时间段内是否超过了最大值。

于 2022-02-22T21:32:47.947 回答