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 调用它的代码。
StuckThreadMaxTime
从weblogic.work.ExecuteThread.execute
开始计数。也许数据库不是唯一要寻找的地方......
@antispam: true,但是我们有 8 组 TDs,耗时 4 分钟,线程在同一行 oracle.jdbc.driver.OracleResultSetImpl.close_or_fetch_from_next(OracleResultSetImpl.java:314) - locked <0x773c1758> (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卡住线程的主要内容,如果未能解决你的问题,请参考以下文章