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

use*_*596 16 java spring datasource hikaricp dbcp

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

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)
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Gir*_*ore 14

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

请尽量增加财产的价值connectionTimeout

YML 配置示例:

spring:
  datasource:
    hikari:
      minimumIdle: 2
      maximumPoolSize: 10
      idleTimeout: 120000
      connectionTimeout: 300000
      leakDetectionThreshold: 300000
Run Code Online (Sandbox Code Playgroud)

Java 配置示例:

HikariConfig config = new HikariConfig();
        config.setMaximumPoolSize(20);
        config.setConnectionTimeout(300000);
        config.setConnectionTimeout(120000);
        config.setLeakDetectionThreshold(300000);
Run Code Online (Sandbox Code Playgroud)

  • 对于阅读最多支持答案的人来说,这是一个重要的警告:增加超时可能会解决症状,但几乎肯定不能解决根本问题。 (45认同)

Vla*_*d L 8

就我而言,代码没有关闭连接。

\n

尝试使用资源修复了它:

\n
try (\n    Connection connection = dataSource.getConnection();\n    Statement statement = \xe2\x80\xa6\n) {\n\xe2\x80\xa6\n}\n\n
Run Code Online (Sandbox Code Playgroud)\n


Yes*_*shi 8

就我而言,我使用 JPA,因此使用 EntityManagerFactory 来持久化并查询我的 springBoot 项目,并得到相同的错误。

原因是在任何 CRUD 操作中,一旦操作完成,我就不会关闭 EntityManager,从而耗尽资源。

希望这可以帮助!!

EntityManager em = emf.createEntityManager();
       Customer c  = em.find(Customer.class , id);
        em.close();
Run Code Online (Sandbox Code Playgroud)

  • 如果实体管理器是自动装配的怎么办?我们还需要关闭它吗? (3认同)

小智 5

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

  • 您如何初始化传递给 DataSourceUtils.getConnection(dataSource) 的“dataSource”参数? (2认同)

jus*_*ous 5

我已经使用以下方法解决了我的问题:

增加 minIdle 和 maxPool

spring.datasource.hikari.minimumIdle=20
spring.datasource.hikari.maximumPoolSize=30
spring.datasource.hikari.connectionTimeout=50000
Run Code Online (Sandbox Code Playgroud)

要调试问题/检查值是否正常,请启用 Hikari 的日志记录:

logging.level.com.zaxxer.hikari.HikariConfig=DEBUG 
logging.level.com.zaxxer.hikari=TRACE
Run Code Online (Sandbox Code Playgroud)

日志将如下所示:

DEBUG 2023-01-06T16:12:31.932018849Z  HikariPool-1 - Before cleanup stats (total=17, active=0, idle=17, waiting=0)
DEBUG 2023-01-06T16:12:31.932665522Z  HikariPool-1 - After cleanup stats (total=17, active=0, idle=17, waiting=0)
DEBUG 2023-01-06T16:12:31.932733949Z  HikariPool-1 - Fill pool skipped, pool is at sufficient level.
DEBUG 2023-01-06T16:12:32.495269726Z  HikariPool-1 - After adding stats (total=17, active=0, idle=17, waiting=0)
DEBUG 2023-01-06T16:12:38.309953158Z  HikariPool-1 - Fill pool skipped, pool is at sufficient level.
DEBUG 2023-01-06T16:12:39.200246897Z  HikariPool-1 - Fill pool skipped, pool is at sufficient level.
DEBUG 2023-01-06T16:12:44.812065268Z  HikariPool-1 - Before cleanup stats (total=18, active=0, idle=18, waiting=0)
DEBUG 2023-01-06T16:12:44.812822113Z  HikariPool-1 - After cleanup stats (total=18, active=0, idle=18, waiting=0)
Run Code Online (Sandbox Code Playgroud)

祝你好运 !:)

警告:请小心,较大的 MaximumPoolSize 可能会产生代码异味,并可能隐藏性能问题,例如:长事务。DB供应商还建议使用较小的maximumPoolSize,例如:maximumPoolSize=10。数据库性能将受到较大的 MaximumPoolSize 值的影响。