数据库连接池线程饥饿

时间:2021-03-10 18:41:56

标签: java database multithreading hikaricp

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

WARN 2076 --- [l-1 管家] com.zaxxer.hikari.pool.HikariPool :HikariPool-1 - 检测到线程饥饿或时钟跳跃(管家 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

1 个答案:

答案 0 :(得分:1)

你没有给我们任何细节,但我可能会这样做:编写“刷新”,以便它一次只尝试执行——比如说——50万行。然后,根据需要经常重复该过程,直到您被告知没有更多记录要刷新。 一个“flusher process”使用循环完成工作。非常确定该进程不会尝试并行运行...

(顺便说一句:“线程饥饿”强烈暗示这可能就是它想要做的事情。否则,为什么线程池会变得“饥饿”?好吧,如果所有线程都 [错误地 . ..] 尝试同时...)

相关问题