ResultSet.next() 在使用 jdbc 与 oracle 11.2 交谈时挂起
Posted
技术标签:
【中文标题】ResultSet.next() 在使用 jdbc 与 oracle 11.2 交谈时挂起【英文标题】:ResultSet.next() hung while talking to oracle 11.2 using jdbc 【发布时间】:2015-07-28 23:17:37 【问题描述】:我们有一个使用 jdbc 与 oracle 11.2 对话的 java 应用程序。我们正在使用 oracle-jdbc-7.jar
Created-By: 20.12-b01 (Sun Microsystems Inc.)
Implementation-Vendor: Oracle Corporation
Implementation-Title: JDBC
Implementation-Version: 12.1.0.1.0
我们也在使用 Statement.setQueryTimeout()
但是,每隔几天,与 oracle 对话的线程就会在执行 ResultSet.next() 时挂起。
代码如下:
PreparedStatement ps = createPreparedStatement();
ps.setQueryTimeout(60);
while (true)
ps.executeQuery();
//iterate over the ResultSet doing ResultSet.next() continuously
//do something with the ResultSet
//sleep for 1 second.
线程转储:
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:152)
at java.net.SocketInputStream.read(SocketInputStream.java:122)
at oracle.net.ns.Packet.receive(Packet.java:311)
at oracle.net.ns.DataPacket.receive(DataPacket.java:105)
at oracle.net.ns.NetInputStream.getNextPacket(NetInputStream.java:305)
at oracle.net.ns.NetInputStream.read(NetInputStream.java:249)
at oracle.net.ns.NetInputStream.read(NetInputStream.java:171)
at oracle.net.ns.NetInputStream.read(NetInputStream.java:89)
at oracle.jdbc.driver.T4CSocketInputStreamWrapper.readNextPacket(T4CSocketInputStreamWrapper.java:123)
at oracle.jdbc.driver.T4CSocketInputStreamWrapper.read(T4CSocketInputStreamWrapper.java:79)
at oracle.jdbc.driver.T4CMAREngineStream.unmarshalUB1(T4CMAREngineStream.java:426)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:390)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:249)
at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:566)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:215)
at oracle.jdbc.driver.T4CPreparedStatement.fetch(T4CPreparedStatement.java:1022)
at oracle.jdbc.driver.OracleStatement.fetchMoreRows(OracleStatement.java:3590)
at oracle.jdbc.driver.InsensitiveScrollableResultSet.fetchMoreRows(InsensitiveScrollableResultSet.java:1008)
at oracle.jdbc.driver.InsensitiveScrollableResultSet.absoluteInternal(InsensitiveScrollableResultSet.java:972)
at oracle.jdbc.driver.InsensitiveScrollableResultSet.next(InsensitiveScrollableResultSet.java:572)
- locked <0x00000000d0873738> (a oracle.jdbc.driver.T4CConnection)
任何解决此问题的想法将不胜感激?
我们尝试过使用 openjdk7 和 oracle 的 JDK 7,但没有帮助。
谢谢。
【问题讨论】:
仅基于堆栈跟踪很难给出建议。发布创建ResultSet
(和查询)的 Java 代码可能有助于解决问题。
Troubleshoot Oracle - hung process 可能是相关的——堆栈跟踪中出现了相同的错误locked <...> (a oracle.jdbc.driver.T4CConnection)
。
@MickMnemonic 我认为你的评论比我的回答要好。
【参考方案1】:
尝试查找阻塞会话。
SELECT
s.blocking_session,
s.sid,
s.serial#,
s.seconds_in_wait
FROM
v$session s
WHERE
blocking_session IS NOT NULL
如果是您的会话,那么您的查询可能需要优化。否则其他原因会导致问题。
附: : 我不是 SQL 专家
【讨论】:
以上是关于ResultSet.next() 在使用 jdbc 与 oracle 11.2 交谈时挂起的主要内容,如果未能解决你的问题,请参考以下文章
jdbc如何判断记录集是否为空?用啥方法?ResultSet本身是否根本就没有这样的方法?