【问题标题】:Java Apparent DeadlockJava 明显死锁
【发布时间】:2020-04-03 03:41:53
【问题描述】:

我在启动时调用了 Db 来获取和缓存数据,我将开始关注。我曾尝试增加我机器上的内存大小,但没有运气。我一直在这里阅读有关这是一个内存问题的信息:Hibernate "APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks!"

这是我的连接配置:

        <property name="maxPoolSize" value="100" />
        <property name="initialPoolSize" value="20" />
        <property name="minPoolSize" value="10" />
        <property name="maxStatements" value="0" />
        <property name="maxIdleTime" value="50" />
        <property name="acquireIncrement" value="2" />
        <property name="unreturnedConnectionTimeout" value="60" />
        <!--<property name="debugUnreturnedConnectionStackTraces" value="true" /> -->
        <property name="acquireRetryAttempts" value="30" />
        <property name="idleConnectionTestPeriod" value="1500" />
        <property name="maxConnectionAge" value="1500" />
2019-12-09 18:31:28 WARN  ThreadPoolAsynchronousRunner:624 - com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@97c462 -- APPARENT DEADLOCK!!! Complete Status:
        Managed Threads: 3
        Active Threads: 3
        Active Tasks:
                com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@1bc3e0b (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0)
                com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@14d66f1 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1)
                com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@1784e93 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2)
        Pending Tasks:
                com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@9a5764
                com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@2e7c1a
                com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@9ef600
                com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@1312b16
                com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@1ca6e23
                com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@8704ec
                com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@164c40a
                com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@11d372b
                com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@1b6f9dd
                com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@1ee3ce3
                com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@81f2c0
                com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@d12254
                com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@134ec2
                com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@9e7107
                com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@15896a6
                com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@38cfdb
                com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@57f880
Pool thread stack traces:
        Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0,5,main]
                java.net.SocketInputStream.socketRead0(Native Method)
                java.net.SocketInputStream.socketRead(Unknown Source)
                java.net.SocketInputStream.read(Unknown Source)
                java.net.SocketInputStream.read(Unknown Source)
                com.microsoft.sqlserver.jdbc.TDSChannel.read(IOBuffer.java:1647)
                com.microsoft.sqlserver.jdbc.SQLServerConnection.Prelogin(SQLServerConnection.java:1117)
                com.microsoft.sqlserver.jdbc.SQLServerConnection.connectHelper(SQLServerConnection.java:1038)
                com.microsoft.sqlserver.jdbc.SQLServerConnection.login(SQLServerConnection.java:817)
                com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(SQLServerConnection.java:700)
                com.microsoft.sqlserver.jdbc.SQLServerDriver.connect(SQLServerDriver.java:842)
                com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:134)
                com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:182)
                com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:171)
                com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:137)
                com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.java:1014)
                com.mchange.v2.resourcepool.BasicResourcePool.access$800(BasicResourcePool.java:32)
                com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run(BasicResourcePool.java:1810)
                com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547)
        Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1,5,main]
                java.net.SocketInputStream.socketRead0(Native Method)
                java.net.SocketInputStream.socketRead(Unknown Source)
                java.net.SocketInputStream.read(Unknown Source)
                java.net.SocketInputStream.read(Unknown Source)
                com.microsoft.sqlserver.jdbc.TDSChannel.read(IOBuffer.java:1647)
                com.microsoft.sqlserver.jdbc.SQLServerConnection.Prelogin(SQLServerConnection.java:1117)
                com.microsoft.sqlserver.jdbc.SQLServerConnection.connectHelper(SQLServerConnection.java:1038)
                com.microsoft.sqlserver.jdbc.SQLServerConnection.login(SQLServerConnection.java:817)
                com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(SQLServerConnection.java:700)
                com.microsoft.sqlserver.jdbc.SQLServerDriver.connect(SQLServerDriver.java:842)
                com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:134)
                com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:182)
                com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:171)
                com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:137)
                com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.java:1014)
                com.mchange.v2.resourcepool.BasicResourcePool.access$800(BasicResourcePool.java:32)
                com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run(BasicResourcePool.java:1810)
                com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547)
        Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2,5,main]
                java.net.SocketInputStream.socketRead0(Native Method)
                java.net.SocketInputStream.socketRead(Unknown Source)
                java.net.SocketInputStream.read(Unknown Source)
                java.net.SocketInputStream.read(Unknown Source)
                com.microsoft.sqlserver.jdbc.TDSChannel.read(IOBuffer.java:1647)
                com.microsoft.sqlserver.jdbc.SQLServerConnection.Prelogin(SQLServerConnection.java:1117)
                com.microsoft.sqlserver.jdbc.SQLServerConnection.connectHelper(SQLServerConnection.java:1038)
                com.microsoft.sqlserver.jdbc.SQLServerConnection.login(SQLServerConnection.java:817)
                com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(SQLServerConnection.java:700)
                com.microsoft.sqlserver.jdbc.SQLServerDriver.connect(SQLServerDriver.java:842)
                com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:134)
                com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:182)
                com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:171)
                com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:137)
                com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.java:1014)
                com.mchange.v2.resourcepool.BasicResourcePool.access$800(BasicResourcePool.java:32)
                com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run(BasicResourcePool.java:1810)
                com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547)```

【问题讨论】:

  • 你检查过数据库的连接数限制吗?一些实现将保留与此限制成比例的内存。
  • 当 JDBC URL 错误或数据库关闭时,我经常看到此消息。我会先检查这些。
  • @schtever 我已经确认两个 URL 都很好,并且数据库已启动。我实际上能够从 ResultSet 中提取一些记录。所以它的工作原理是,只是没有得到所有的记录。
  • @NigelSavage 所以,但我必须验证这一点才能确定。谢谢,我明天检查后会报告。

标签: java c3p0


【解决方案1】:

从数据库获取新连接的尝试挂起 - 在很长一段时间内既没有成功也没有失败并出现异常。在线程转储中,我们可以看到获取新连接的尝试在套接字读取时被阻塞。这就是您要调试的内容:为什么会这样?

正如 Nigel Savage 所建议的那样,一种可能性是您在服务器端达到了一些资源限制,可能是一些连接超出了服务器阻塞并等待连接在完成新连接之前返回。如果是这种情况,更改服务器端的配置和容量可能会解决问题。测试这个假设的一个简单方法是选择一个小得多的池大小(maxPoolSize,您确信服务器可以轻松处理)并查看APPARENT DEADLOCK 是否继续显现。如果它消失了,可能是服务器端连接容量是罪魁祸首。

您可以使用maxAdministrativeTaskTime 解决此问题。但我不建议这样做。最好理解并解决问题,而不是笨拙地强迫它消失。

【讨论】:

  • 嗨@Steve Waldman,我尝试添加以下内容: AND .应用程序开始提取 ResultSet 并仅在 3 条记录后停止?
  • 但是我不再看到死锁问题,所以......也许有进展? :)
  • 我不会……不称之为进步。我不认为你的 just-stops-after-3-secs 是相关的,这可能是一个不同的问题。但我不推荐maxAdministrativeTaskTime。你试过一个小得多的游泳池吗?您真的很想了解为什么获取数据库连接会挂起。
  • 是的,我摆脱了maxAdministrativeTaskTime,现在我们到了。仍然不确定主要问题是什么。我尝试将线程池降低到 1,但也没有运气。
  • 1 太小。但是线程池很小,你还能得到APPARENT DEADLOCKs吗?
猜你喜欢
  • 2019-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多