【问题标题】:Databse connection pool thread starvation [closed]数据库连接池线程饥饿[关闭]
【发布时间】:2021-06-08 18:16:11
【问题描述】:

我正在开发一个要求我每 24 小时刷新一次数据库中的数据的应用程序。我们可能有数百万数据要刷新。代码方面,一切都在我身边。观察结果如下,我能够立即刷新 50 万条记录。然后我去尝试刷新 500 万条记录。服务器应用程序没有崩溃,但我收到此警告:

WARN 2076 --- [l-1 housekeeper] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - 检测到线程不足或时钟跳跃(housekeeper delta=51s629ms256µs700ns)。

最终,它会出现诸如服务器连接中断之类的异常......有问题的服务器是数据库服务器。

2021-03-10 13:35:38,420 ERROR [Thread-802] c.n.j.j.p.ProjectDAO [ProjectDAO.java:1145] Some error has occurred with your query.
java.sql.SQLTransientConnectionException: HikariPool-1 - Connection is not available, request timed out after 33285ms.
    at com.zaxxer.hikari.pool.HikariPool.createTimeoutException(HikariPool.java:689)
    at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:196)
    at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:161)
    at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:128)
    at com.nomadlogic.juju.jdbc.projectDAO.ProjectDAO.getRespondentsReadyForPostSync(ProjectDAO.java:1119)
    at com.nomadlogic.juju.jdbc.projectDAO.ProjectDAO$$FastClassBySpringCGLIB$$85fa6901.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:769)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:747)
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:139)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:747)
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:689)
    at com.nomadlogic.juju.jdbc.projectDAO.ProjectDAO$$EnhancerBySpringCGLIB$$7f453eb9.getRespondentsReadyForPostSync(<generated>)
    at com.nomadlogic.juju.post_synchronization.PostSynchronizationThread.run(PostSynchronizationThread.java:84)
Caused by: com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure

【问题讨论】:

  • 您的数据库服务器无法处理负载? “如何高效批处理大量数据”的经典案例?

标签: java database multithreading hikaricp


【解决方案1】:

您没有向我们提供任何详细信息,但我可能会这样做:编写“flush”,以便它一次只尝试执行 - 比如说 - 50 万行。然后,根据需要经常重复该过程,直到您被告知没有更多记录要刷新。 一个“冲洗程序”使用循环完成工作。确保进程不会尝试并行运行...

(顺便说一句:“线程饥饿”相当强烈地表明,也许这就是它试图做的事情。否则,到底为什么线程池会变得“饥饿?”好吧,如果所有线程都 [不正确. ..] 尝试同时执行一项耗时的任务 ...)

【讨论】:

  • 谢谢,我已经通过小块处理走了一点路
猜你喜欢
  • 2012-07-26
  • 1970-01-01
  • 2016-06-23
  • 1970-01-01
  • 2021-02-20
  • 1970-01-01
  • 2020-08-05
  • 2023-01-07
  • 2017-12-15
相关资源
最近更新 更多