【问题标题】:Unresponsive thread in TomcatTomcat中的无响应线程
【发布时间】:2009-08-06 12:48:40
【问题描述】:

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

问题: 我有一个处于 RUNNABLE 状态的线程。 它似乎永远不会完成。

我该如何进一步调查? 这很容易重现。

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

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

这是我从 thread dump.. 中得到的。

"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)

【问题讨论】:

  • 这个问题的标题可以更改以反映正在发生的事情。即 JDBC Oracle 调用阻塞
  • 虽然我们无法确认 - 我们觉得 JVM 和数据库之间存在死锁 - 数据库或 JVM 都无法检测到 dbforums.com/oracle/…

标签: java tomcat multithreading


【解决方案1】:

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

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

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

【讨论】:

  • 还要检查你试图在 SQLPLus 中执行的语句
  • 这有帮助...我在您的回答 dbforums.com/oracle/… 之后找到了一个帖子,这似乎与我的情况相似。
  • @RN,您解决了您的问题还是仍然存在问题?如果问题已解决,您应该使用解决问题的信息更新您的问题,或接受答案 - 以帮助该页面的未来查看者。
【解决方案2】:

注册护士:

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

希望对你有帮助。

老虎。

【讨论】:

    【解决方案3】:

    批处理语句可能不返回的原因之一是由于先前运行的查询未正确提交更改而导致表锁定。

    如果是这种情况 - 您应该查看所有 autoCommit(true) / autoCommit(false) 已设置的代码,以及是否在异常处理子句中使用了回滚,否则提交。

    您还可以从 Visual VM 工具检查配置文件转储 - 在开发环境中对正在运行的应用程序进行测试时会派上用场。它提供了方法调用执行的完整钻取。

    【讨论】:

    • 我认为 Oracle 使用版本控制/快照方法而不是 SQL Server 样式锁定。
    猜你喜欢
    • 2018-10-03
    • 1970-01-01
    • 2011-07-19
    • 2011-04-17
    • 2013-08-05
    • 1970-01-01
    • 1970-01-01
    • 2016-03-24
    • 2015-05-25
    相关资源
    最近更新 更多