问题: 我有一个处于RUNNABLE状态的线程。 它似乎并不完整。
我如何进一步调查? 这很容易重复。
这个线程基本上是试图插入一些数据
更新:此插入发生在同步块
中这是我从线程转储中获得的。
"http-9080-Processor24" daemon prio=6 tid=0x0b20bc00 nid=0x1274 runnable [0x0d55e000..0x0d55fc94]
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(Unknown Source)
at oracle.net.ns.Packet.receive(Unknown Source)
at oracle.net.ns.DataPacket.receive(Unknown Source)
at oracle.net.ns.NetInputStream.getNextPacket(Unknown Source)
at oracle.net.ns.NetInputStream.read(Unknown Source)
at oracle.net.ns.NetInputStream.read(Unknown Source)
at oracle.net.ns.NetInputStream.read(Unknown Source)
at oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1099)
at oracle.jdbc.driver.T4CMAREngine.unmarshalSB1(T4CMAREngine.java:1070)
at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:478)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:216)
at oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:955)
at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:10580)
- locked <0x02c10078> (a oracle.jdbc.driver.T4CPreparedStatement)
- locked <0x03dceb08> (a oracle.jdbc.driver.T4CConnection)
at org.apache.commons.dbcp.DelegatingStatement.executeBatch(DelegatingStatement.java:294)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
答案 0 :(得分:2)
看起来您的应用程序正在执行oracle.jdbc.driver.OraclePreparedStatement.executeBatch()
,它似乎正在等待(永远?)NetInputStream实际返回的内容。
那么,运行的查询/语句是否可能永远不会返回?您的数据库可能挂起了吗?或者你可能在Oracle JDBC驱动程序中遇到过某种错误 - 你是否使用最新的版本?
您还应该检查您的JDBC驱动程序是否允许您指定连接/查询超时等的配置,以防止驱动程序永远等待。
答案 1 :(得分:0)
RN:
如果你有一个java核心转储文件,你是否尝试使用Java SE 5中的HPROF tools? 我通常使用此工具作为查找源代码中问题所在的简单方法。如果它没有帮助,我可能会使用a profiler tool。如果您的问题有误,请纠正我。
我希望它有所帮助。
虎。
答案 2 :(得分:0)
批处理语句可能无法返回的原因之一是由于表上的锁定 - 因为以前运行的查询未正确提交更改。
如果是这种情况 - 您应该检查已经设置了所有autoCommit(true)/ autoCommit(false)的代码,以及是否在异常处理子句中使用了回滚,否则提交。
您还可以检查Visual VM工具中的配置文件转储 - 这在为开发环境中正在运行的应用程序进行测试时非常方便。它提供了方法调用执行的完整深入分析。