【问题标题】:Hikari timeout error during java stress testjava压力测试期间的Hikari超时错误
【发布时间】:2020-11-15 14:05:15
【问题描述】:

我正在尝试对我的简单 crud spring boot 应用程序进行压力测试,但我遇到了 Hikari 超时错误。我试图增加最大池大小,但我仍然遇到同样的问题。如果池大小大于或等于并发请求,则没有例外,但它太慢了。你有什么想法吗?

app_1    | 2020-11-14 17:20:01.723 DEBUG 1 --- [nio-80-exec-150] o.s.orm.jpa.JpaTransactionManager        : Participating transaction failed - marking existing transaction as rollback-only
app_1    | 2020-11-14 17:20:01.723 DEBUG 1 --- [nio-80-exec-150] o.s.orm.jpa.JpaTransactionManager        : Setting JPA transaction on EntityManager [SessionImpl(988067110<open>)] rollback-only
app_1    | 2020-11-14 17:20:01.724 DEBUG 1 --- [nio-80-exec-150] o.a.c.loader.WebappClassLoaderBase       :     findClass(jdk.internal.reflect.GeneratedMethodAccessor80)
app_1    | 2020-11-14 17:20:01.725 DEBUG 1 --- [nio-80-exec-150] o.a.c.loader.WebappClassLoaderBase       :     --> Returning ClassNotFoundException
app_1    | 2020-11-14 17:20:01.715 DEBUG 1 --- [nio-80-exec-102] o.a.c.loader.WebappClassLoaderBase       :     findClass(jdk.internal.reflect.GeneratedMethodAccessor76)
app_1    | 2020-11-14 17:20:01.727 DEBUG 1 --- [nio-80-exec-102] o.a.c.loader.WebappClassLoaderBase       :     --> Returning ClassNotFoundException
app_1    | 2020-11-14 17:20:01.727 DEBUG 1 --- [nio-80-exec-153] o.a.c.loader.WebappClassLoaderBase       :     findClass(jdk.internal.reflect.GeneratedMethodAccessor75)
app_1    | 2020-11-14 17:20:01.728 DEBUG 1 --- [nio-80-exec-153] o.a.c.loader.WebappClassLoaderBase       :     --> Returning ClassNotFoundException
app_1    | 2020-11-14 17:20:01.728 DEBUG 1 --- [nio-80-exec-102] o.a.c.loader.WebappClassLoaderBase       :     findClass(jdk.internal.reflect.GeneratedMethodAccessor82)
app_1    | 2020-11-14 17:20:01.729 DEBUG 1 --- [nio-80-exec-102] o.a.c.loader.WebappClassLoaderBase       :     --> Returning ClassNotFoundException
app_1    | 2020-11-14 17:20:01.729 DEBUG 1 --- [nio-80-exec-153] o.h.engine.jdbc.spi.SqlExceptionHelper   : unable to obtain isolated JDBC connection [n/a]
app_1    |
app_1    | java.sql.SQLTransientConnectionException: HikariPool-1 - Connection is not available, request timed out after 30004ms.

编辑:

https://github.com/wlp2s0/basic-java-web-services

这是我的简单 CRUD 的 repo。查询非常简单,数据库为空,所以这个错误看起来很奇怪。

【问题讨论】:

  • 听起来您的代码/查询太慢了。 Hikari 写了一篇关于pool sizing 的文章。
  • 嗨,我阅读了有关 Hikari 池大小的信息并相应地调整了池大小(我也尝试增加池大小,但响应时间太慢)遗憾的是问题仍然存在并且查询/代码非常如果你看到代码很简单。它们只是一个简单表上的 4 个 CRUD 操作,没有数据处理,也没有关系。

标签: java mysql spring spring-boot benchmarking


【解决方案1】:

我目前遇到了同样的问题。似乎解决方法是增加连接超时。

正如您在堆栈中看到的,有一个 SQLException:

java.sql.SQLTransientConnectionException: HikariPool-1 - Connection is not available, request timed out after 30004ms.

这正是 hikariCP 在客户端没有收到来自池的任何连接后在异常时间(30 秒)获取时间戳的默认连接超时值 30000 毫秒 + 4 毫秒(我猜)。(连接可能需要更长的时间才能由于网络性能、数据库过载或什至可能有多个线程在请求​​线程前排队,因此执行一个查询超过 30 秒,因此它再次超时,直到获得连接。)

我的解决方案是增加连接超时,以便客户端等待的时间超过 30 秒,因此不会抛出 SQLException。 (SQLTransientConnectionException 是 SQLException 的子类)

config.setConnectionTimeout(TimeUnit.MINUTES.toMillis(10));
config.setValidationTimeout(TimeUnit.MINUTES.toMillis(8));

在这里它将等待 10 分钟。如果需要更长的时间,当然会再次抛出异常。

您可以参考参数Here 了解更多信息。如您所见,将引发异常的是“connectionTimeout”参数,上面的错误也很有意义。我今天为此苦苦挣扎……祝你好运!

【讨论】:

  • "甚至可能有几个线程在请求​​的线程前面排队":这是什么意思?它是如何导致超时的?
  • 我有一个与问题中所述类似的问题,我们所有的端点都需要不到 2 秒的时间来执行,但是我们得到了超时。有什么简单的方法可以了解导致连接“停止”的原因?
猜你喜欢
  • 2022-01-11
  • 2011-12-29
  • 2012-03-12
  • 1970-01-01
  • 2012-06-05
  • 1970-01-01
  • 1970-01-01
  • 2014-05-31
  • 2011-08-11
相关资源
最近更新 更多