Java Tomcat中的无响应线程

Java Tomcat中的无响应线程,java,tomcat,multithreading,Java,Tomcat,Multithreading,Env:Windows上Java 1.5.x上的Tomcat 5.x在Oracle 9i上使用OracleJDBC驱动程序 问题: 我有一个线程处于可运行状态。 它似乎从未完成过 我如何进一步调查这一点? 这是很容易复制的 这个线程基本上是试图插入一些数据 更新:此插入发生在同步块中 这是我从线程转储中得到的.. "http-9080-Processor24" daemon prio=6 tid=0x0b20bc00 nid=0x1274 runnable [0x0d55e000..0x0d55

Env:Windows上Java 1.5.x上的Tomcat 5.x在Oracle 9i上使用OracleJDBC驱动程序

问题: 我有一个线程处于可运行状态。 它似乎从未完成过

我如何进一步调查这一点? 这是很容易复制的

这个线程基本上是试图插入一些数据

更新:此插入发生在同步块中

这是我从线程转储中得到的..

"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)
“http-9080-Processor24”守护进程prio=6 tid=0x0b20bc00 nid=0x1274可运行[0x0d55e000..0x0d55fc94]
java.lang.Thread.State:可运行
位于java.net.SocketInputStream.socketRead0(本机方法)
位于java.net.SocketInputStream.read(未知源)
位于oracle.net.ns.Packet.receive(未知源)
位于oracle.net.ns.DataPacket.receive(未知源)
位于oracle.net.ns.NetInputStream.getNextPackage(未知源)
位于oracle.net.ns.NetInputStream.read(未知源)
位于oracle.net.ns.NetInputStream.read(未知源)
位于oracle.net.ns.NetInputStream.read(未知源)
位于oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1099)
位于oracle.jdbc.driver.T4CMAREngine.unmarshalSB1(T4CMAREngine.java:1070)
位于oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:478)
位于oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:216)
位于oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:955)
位于oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:10580)
-锁定(一个oracle.jdbc.driver.T4CPreparedStatement)
-锁定(一个oracle.jdbc.driver.T4CConnection)
位于org.apache.commons.dbcp.DelegatingStatement.executeBatch(DelegatingStatement.java:294)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(未知源)
在sun.reflect.DelegatingMethodAccessorImpl.invoke处(未知源)
位于java.lang.reflect.Method.invoke(未知源)
RN:

如果您有一个java核心转储文件,您是否尝试使用JavaSE5? 我通常使用这个工具作为一种简单的方法来找出源代码中的问题所在。如果没有帮助,我可能会使用。如果你的问题不对,请纠正我

我希望有帮助


Tiger.

看起来您的应用程序正在执行oracle.jdbc.driver.OraclePreparedStatement.executeBatch(),它似乎在等待(永远?)NetInputStream实际返回某些内容

那么,是否可能正在运行的查询/语句永远不会返回?你的数据库可能挂起了吗?或者,您可能在Oracle JDBC驱动程序中遇到了某种错误—您是否使用了最新版本


您可能还应该检查JDBC驱动程序是否允许您为连接/查询超时等指定配置,防止驱动程序永远等待。

批处理语句可能无法返回的原因之一是,由于以前运行的查询未正确提交更改,表上的锁被保留

如果是这种情况-您应该检查设置了所有自动提交(true)/autoCommit(false)的代码,以及是否在异常处理子句中使用了回滚,并以其他方式提交


您还可以从VisualVM工具中检查概要文件转储,这在对DevelopmentEnv中正在运行的应用程序进行测试时非常方便。它提供了方法调用执行的完整深入分析。

还检查了您试图在SQLPlust中执行works的语句,这有助于。。。我在你的回答后发现了一条线索,似乎与我的情况类似。@RN,你解决了你的问题了吗?还是这仍然是一个问题?如果问题已解决,您应该使用解决问题的信息更新您的问题,或者接受答案-以帮助此页面的未来查看者。我认为Oracle使用版本控制/快照方法而不是SQL Server样式的锁定。可以更改此问题的标题以反映发生的情况。i、 e.JDBC Oracle调用阻塞尽管我们无法确认—我们感觉JVM和数据库之间存在死锁—但数据库或JVM都无法检测到