gpt4 book ai didi

java - 使用 jdbc 澄清 oracle 中的游标

转载 作者:搜寻专家 更新时间:2023-11-01 03:14:44 25 4
gpt4 key购买 nike

我遇到的情况是,我正在使用的第 3 方开源产品在 Oracle 中用完游标并收到错误:java.sql.SQLException: ORA-01000: 超出最大打开游标数

我的最大游标设置为 1000,我试图弄清楚达到此限制的代码是否做错了什么,或者我是否只是需要增加我的限制。

经过一番调查后,我在代码中找到了创建 ResultSet 的点,从而将我打开的游标计数增加了 1。但是,该 ResultSet 在使用后很快就关闭了....但是游标计数保持不变.我能够在第 3 方开源项目之外的简单 JDBC 应用程序中重现逻辑。

package gov.nyc.doitt.cursor;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class CursorTest {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;

try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@myhost:1537:mydb", "username", "password");

// as expected: there are 0 cursors associated with my session at this point

ps = conn.prepareStatement("select my_column from my_table where my_id = ?");
ps.setInt(1, 86);

// as expected: there are 0 cursors associated with my session at this point

rs = ps.executeQuery(); // opens 1 cursor

// as expected: there is 1 open cursor associated with my session at this point
} catch (Throwable t) {
t.printStackTrace();
} finally {
// as expected: there is 1 open cursor associated with my session at this point
try {
rs.close();
} catch (SQLException e) {
System.err.println("Unable to close rs");
}
// not expected: there is still 1 open cursor associated with my session at this point
try {
ps.close();
} catch (SQLException e) {
System.err.println("Unable to close simplePs");
}
// not expected: there is still 1 open cursor associated with my session at this point
try {
conn.close();
} catch (SQLException e) {
System.err.println("Unable to close conn");
}
// as expected: at this point my session is dead and so are all the associated cursors
}
}
}

我发现一些 Oracle 文档让我认为如果您关闭我们的 ResultSet 和 PreparedStatements,所有打开的游标都会关闭,但我打开的游标似乎在附近徘徊。请参阅此 FAQ (http://download.oracle.com/docs/cd/B10501_01/java.920/a96654/basic.htm#1006509),它说“关闭结果集或语句会释放数据库中相应的游标。”仅根据我的测试似乎没有发生,所以我一定缺乏一些基本的理解。

任何人都可以解释 Oracle 如何处理游标或向我指出一些可以启发我的文档吗?

谢谢!

最佳答案

很久以前我遇到过类似的问题。据我所知,问题出在垃圾回收延迟上。在垃圾收集器找到并释放适当的对象之前,数据库游标不会关闭。如果频繁创建语句,您可能会遇到此问题。不时尝试手动调用垃圾收集器:

Runtime r = Runtime.getRuntime();
r.gc();

只是为了验证这个假设。

关于java - 使用 jdbc 澄清 oracle 中的游标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1903041/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com