java - 使用 jdbc 与 oracle 11.2 通信时 ResultSet.next() 挂起

标签 java oracle jdbc

我们有一个使用 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,但没有帮助。

谢谢。

最佳答案

尝试找到阻塞 session 。

SELECT
   s.blocking_session, 
   s.sid, 
   s.serial#, 
   s.seconds_in_wait
FROM
   v$session s
WHERE
   blocking_session IS NOT NULL

如果这是您的 session ,那么您的查询可能需要优化。否则其他原因会导致问题。

附言: 我不是 SQL 专家

关于java - 使用 jdbc 与 oracle 11.2 通信时 ResultSet.next() 挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31688734/

相关文章:

java - 从结果集中输出大的 xml

mysql - JDBC 到 mysql 5.7.21 和 java 1.8.0_162;不支持的记录版本 Unknown-0.0

Hibernate ORM 框架与 JDBC 的优缺点

java - 我该如何解决这个明显的合并错误

java - gradle build输出与vscode java扩展相同的警告

sql - 在 SQL Server 和 Oracle 中获取今天日期的兼容语法

sql - 如何查找 Oracle 表中的月份间隔?

java - 如何阻止属性类以不合逻辑的顺序输出到文件。解决方法?

java - 需要 java 算法的帮助来查找最大值和最小值

sql嵌套case语句