java jdbc和oracle - 超出了最大打开游标数

时间:2011-12-18 14:41:18

标签: java oracle jdbc

我有一些从Oracle检索数据的JDBC代码。

在我的方法中,我使用预备语句,但是我没有关闭那个准备好的语句。 为了测试它,我在一个循环中运行它,当然我得到了一个例外:

ORA-01000: maximum open cursors exceeded

我的问题是托管环境(使用连接池在Java EE Application Server上部署的代码):

  • 申请会怎样?
  • 除非关闭/回收连接,否则它永远无法向数据库发出任何SQL查询? (假设池中只有一个连接)

我假设因为池中的连接并未真正关闭 - oracle会话将处于活动状态。

3 个答案:

答案 0 :(得分:5)

您需要关闭执行查询时返回的ResultSet个对象。为确保不泄漏游标,您需要在finally块中执行此操作。我相信这也适用于托管环境。

答案 1 :(得分:2)

您必须关闭Prepared Statement,否则您将无法执行更多查询。

假设你有:

        PreparedStatement ps = conn.prepareStatement("select * from my_table");
        ps.execute();
        ps.close();

你必须执行ps.close以避免这个问题。正如我@Stephen所说,也关闭了ResultSet。

    ResultSet rs = ps.executeQuery();

    rs.close();
    ps.close();

答案 2 :(得分:1)

在oracle数据库上生成最大打开游标错误。它是具有此限制的数据库。应用程序将继续发送请求,但数据库将返回错误。

当超过最大打开游标时,应用程序(即客户端)仍然可以继续将请求发送到数据库,但数据库将拒绝请求,直到打开游标关闭。

您可以使用

之类的内容增加允许的打开游标
“ALTER SYSTEM SET OPEN_CURSORS=2000 SID=’DUMMY’”;

但上述问题并未解决问题。要修复它,您需要关闭您的连接/结果集/ PreparedStatements等。

当您的应用服务器无法发送SQL请求时,一种可能的情况是,连接池上允许的活动连接数小于数据库允许的连接数。