Java:如何读取锁定的线程转储
有人能帮我理解我应该如何阅读这篇文章吗Java:如何读取锁定的线程转储,java,locking,deadlock,thread-dump,Java,Locking,Deadlock,Thread Dump,有人能帮我理解我应该如何阅读这篇文章吗 "Task-Thread-for-com.mchange.v2.async.ThreadPerTaskAsynchronousRunner@488cf1f1" daemon prio=6 tid=0x000000000880f000 nid=0x644 runnable [0x00000000213ef000] java.lang.Thread.State: RUNNABLE at java.net.SocketInputStream.soc
"Task-Thread-for-com.mchange.v2.async.ThreadPerTaskAsynchronousRunner@488cf1f1" daemon prio=6 tid=0x000000000880f000 nid=0x644 runnable [0x00000000213ef000]
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:129)
at java.io.DataInputStream.readFully(DataInputStream.java:178)
at java.io.DataInputStream.readFully(DataInputStream.java:152)
at net.sourceforge.jtds.jdbc.SharedSocket.readPacket(SharedSocket.java:841)
at net.sourceforge.jtds.jdbc.SharedSocket.getNetPacket(SharedSocket.java:722)
- locked <0x000000016ac834e0> (a java.util.ArrayList)
at net.sourceforge.jtds.jdbc.ResponseStream.getPacket(ResponseStream.java:466)
at net.sourceforge.jtds.jdbc.ResponseStream.read(ResponseStream.java:103)
at net.sourceforge.jtds.jdbc.ResponseStream.peek(ResponseStream.java:88)
at net.sourceforge.jtds.jdbc.TdsCore.wait(TdsCore.java:3928)
at net.sourceforge.jtds.jdbc.TdsCore.executeSQL(TdsCore.java:1045)
- locked <0x000000016ad0b838> (a net.sourceforge.jtds.jdbc.TdsCore)
at net.sourceforge.jtds.jdbc.JtdsStatement.executeSQLQuery(JtdsStatement.java:465)
at net.sourceforge.jtds.jdbc.JtdsStatement.executeQuery(JtdsStatement.java:1301)
at com.mchange.v2.c3p0.impl.DefaultConnectionTester.activeCheckConnection(DefaultConnectionTester.java:73)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.testPooledConnection(C3P0PooledConnectionPool.java:374)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.refurbishIdleResource(C3P0PooledConnectionPool.java:310)
at com.mchange.v2.resourcepool.BasicResourcePool$AsyncTestIdleResourceTask.run(BasicResourcePool.java:1999)
at com.mchange.v2.async.ThreadPerTaskAsynchronousRunner$TaskThread.run(ThreadPerTaskAsynchronousRunner.java:255)
谢谢!
-SeanJDBC调用中的这种锁定是正常的。我猜您的问题不在JDBC层 因为我看不到数据库控制台,所以我猜您的问题是数据库方面的两件事之一,死锁或暂停查询。再次检查数据库控制台,问题似乎不在JDBC代码中。如果看不到数据库控制台,那么在JDBC中打开SQL跟踪,查看正在运行的查询
真正的Java级死锁将在线程转储中清楚地说明这一点。您似乎有一个性能问题,数据库查询响应极慢,占用了您的所有连接。我也遇到了同样的问题,请参阅 使用c3p0调试模型找出代码的哪个部分使用会话而不是发布 添加c3p0配置:
debugUnreturnedConnectionStackTraces = true;
unreturnedConnectionTimeout = 20 ; // That's i used for
如果你认为你有一个死锁,请张贴整个线程转储。FWIW,这个线程看起来很好-只是在使用db处理一些i/o。从线程转储中添加了更多线程。。。完整的线程转储对于发布来说太长了(它不允许我发布)我遇到了同样的问题,请看,谢谢,在做了更多的挖掘之后,我开始了另一个问题,它看起来确实在数据库端。
debugUnreturnedConnectionStackTraces = true;
unreturnedConnectionTimeout = 20 ; // That's i used for