Tomcat中没有响应的线程

时间:2009-08-06 12:48:41

标签: java tomcat multithreading

使用Oracle 9i上的OracleJDBC驱动程序

Env:在Java 1.5.x上运行Tomcat 5.x

问题: 我有一个处于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)

3 个答案:

答案 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工具中的配置文件转储 - 这在为开发环境中正在运行的应用程序进行测试时非常方便。它提供了方法调用执行的完整深入分析。