JDBC调用上的Weblogic卡住线程

Posted

技术标签:

【中文标题】JDBC调用上的Weblogic卡住线程【英文标题】:Weblogic Stuck Thread on JDBC call 【发布时间】:2010-12-22 10:23:28 【问题描述】:

我们经常在我们的 Weblogic 服务器上遇到一系列 Stuck 线程。我已经分析了一段时间。

我想了解的是,这个卡住的线程块是否表明 它仍在从打开的套接字读取数据到数据库,因为查询是简单的 SELECT 东西?

at java.net.SocketInputStream.socketRead0(Native Method)
        at java.net.SocketInputStream.read(SocketInputStream.java:129)
        at oracle.net.ns.Packet.receive(Packet.java:239)
        at oracle.net.ns.DataPacket.receive(DataPacket.java:92)

我们已经运行了 netstat 和其他命令,从 Weblogic 应用服务器到数据库的套接字与池中的连接数相匹配。

还有什么我们应该在这里调查的想法吗?

线程转储的堆栈跟踪:

"[STUCK] ExecuteThread: '2' for queue: 'weblogic.kernel.Default (self-tuning)'" daemon prio=10 tid=0x61a5b000 nid=0x25f runnable [0x6147b000..0x6147eeb0]
   java.lang.Thread.State: RUNNABLE
        at java.net.SocketInputStream.socketRead0(Native Method)
        at java.net.SocketInputStream.read(SocketInputStream.java:129)
        at oracle.net.ns.Packet.receive(Packet.java:239)
        at oracle.net.ns.DataPacket.receive(DataPacket.java:92)
        at oracle.net.ns.NetInputStream.getNextPacket(NetInputStream.java:172)
        at oracle.net.ns.NetInputStream.read(NetInputStream.java:117)
        at oracle.net.ns.NetInputStream.read(NetInputStream.java:92)
        at oracle.net.ns.NetInputStream.read(NetInputStream.java:77)
        at oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1023)
        at oracle.jdbc.driver.T4CMAREngine.unmarshalSB1(T4CMAREngine.java:999)
        at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:584)
        at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:183)
        at oracle.jdbc.driver.T4CStatement.fetch(T4CStatement.java:1000)
        at oracle.jdbc.driver.OracleResultSetImpl.close_or_fetch_from_next(OracleResultSetImpl.java:314)
        - locked <0x774546e0> (a oracle.jdbc.driver.T4CConnection)
        at oracle.jdbc.driver.OracleResultSetImpl.next(OracleResultSetImpl.java:228)
        - locked <0x774546e0> (a oracle.jdbc.driver.T4CConnection)
        at weblogic.jdbc.wrapper.ResultSet_oracle_jdbc_driver_OracleResultSetImpl.next(Unknown Source)

weblogic.work.ExecuteThread.run 到这里的位已被省略。我们有 8 组线程转储 - 每组都显示线程在同一行等待,并且同一个对象被锁定

at oracle.jdbc.driver.OracleResultSetImpl.close_or_fetch_from_next(OracleResultSetImpl.java:314)
        - locked <0x774546e0> (a oracle.jdbc.driver.T4CConnection)

【问题讨论】:

weblogic.jdbc.wrapper.ResultSet_oracle_jdbc_driver_OracleResultSetImpl.next 是栈底吗? @antispam:不,剩下的就是我们通过 springframework API 调用它的代码。 StuckThreadMaxTimeweblogic.work.ExecuteThread.execute 开始计数。也许数据库不是唯一要寻找的地方...... @antispam: true,但是我们有 8 组 TDs,耗时 4 分钟,线程在同一行 oracle.jdbc.driver.OracleResultSetImpl.close_or_fetch_from_next(OracleResultSetImpl.java:314) - locked &lt;0x773c1758&gt; (a oracle.jdbc.driver.T4CConnection) @JoseK 你能告诉我你的问题是什么吗? 【参考方案1】:

在打印堆栈时,似乎阻塞等待来自服务器的更多数据

at oracle.jdbc.driver.OracleResultSetImpl.next(OracleResultSetImpl.java:228)

也许只是查询的时间超过了StuckThreadMaxTime,并且 WL 发出了警告。

如果可能我会尝试:

查找导致线程卡住的查询并检查执行时间 使用 Wireshark 分析与数据库的通信 查看驱动程序源代码(想到 JD)以了解堆栈跟踪

【讨论】:

堆栈跟踪中的查询各不相同——它并不总是相同的,而且我们在不同的日子里在 Oracle 数据库上运行了 statspack——但没有找到一个长时间运行的查询。 Wireshark 和驱动程序是接下来要做的一件好事。将首先检查最新的驱动程序版本 我们发现我们的驱动程序在ojdbc6.jar,我们使用JDK1.6连接到Oracle 10.2.0.4 db。关于我们是否应该尝试使用 ojdbc14.jar 的一些争论,因为数据库不是 Oracle 11 AFAIK,建议使用最新的 JDBC,因为它向后兼容 10g 并且有一些错误修复(参见 confluence.atlassian.com/display/JIRA/…)【参考方案2】:

如果您使用 weblogic 调试标志 -Dweblogic.debug.DebugJDBCSQL,您将能够跟踪实际正在执行的 SQL

【讨论】:

以上是关于JDBC调用上的Weblogic卡住线程的主要内容,如果未能解决你的问题,请参考以下文章

weblogic 开启注意问题

weblogic监控

weblogic 应用运行异常

单独线程锁父中的 Java JDBC 查询

是否可以在不重新启动服务器的情况下在远程 weblogic 上重新部署应用程序?

atitit.线程死锁 卡住无反应 的原因in cmd调用的解决方案  v3 q39