2011-12-18 88 views
4

我有一些从Oracle检索数据的JDBC代码。java jdbc和oracle - 超出最大打开游标数

在我的方法我用事先准备好的声明,但我不关闭准备好的声明。 为了测试它,我在一个循环跑了这一点,果然我有一个例外:

ORA-01000: maximum open cursors exceeded 

我的问题是在托管环境(代码中使用连接池部署Java EE应用服务器上)的情况下:

  • 应用程序会发生什么?
  • 除非连接被关闭/回收,否则永远无法启动对数据库的任何SQL查询吗? (假设池中只有1个连接)

我假设池中的连接并没有真正关闭 - oracle会话仍然存在。

回答

5

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

+0

感谢斯蒂芬 - 是的,这部分了解有关如何防止这种情况的发生 - 我的问题是更相关的是什么,如果发生这种情况的影响 - 这是像泄漏的连接,可以使应用程序停顿 - 但在游标被泄露的情况下 - 它是否会导致应用程序停顿? – akila 2011-12-19 02:18:17

+0

@akila - ResultSet对象的泄漏(即未能关闭它们)将导致查询失败,并可能导致应用程序停顿。 – 2011-12-19 14:24:34

+0

谢谢 - 我想我会尝试使用一些应用程序服务器,并确认 – akila 2011-12-21 10:07:12

1

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

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

可以增加使用的东西所允许打开的游标像

“ALTER SYSTEM SET OPEN_CURSORS=2000 SID=’DUMMY’”; 

但上面的不是解决问题。要修复它,你需要关闭你的连接/结果集/ PreparedStatements等。

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

+0

感谢Ziggy所以在托管环境中,一旦我达到最大光标问题 - 这是否意味着,除非我弹出/启动/停止应用程序服务器,我不会是麦尔执行我的查询?我明白,如果我不关闭连接,最终池中的所有连接都将被占用,应用程序将停止运行,并且我们将被迫重新启动应用程序服务器 – akila 2011-12-19 02:15:12

+0

是的,因为如果您退出应用程序服务器,您将释放这些资源。 – ziggy 2011-12-19 10:58:37

+0

谢谢Ziggy我会尝试使用应用程序服务器,看看如果我不关闭结果集,并且准备好的语句 – akila 2011-12-21 10:07:53

2

必须关闭预处理语句,否则您将无法执行多个查询。

假设您有:

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

我@Stephen说,你必须执行ps.close避免这种issue.And,也关闭ResultSet。

ResultSet rs = ps.executeQuery(); 

    rs.close(); 
    ps.close(); 
+0

现在一直在寻找这个答案,会产生什么样的影响。你所说的是第一个有道理的答案。谢谢,你帮我调试了我的程序。 – Bojan 2013-08-13 12:26:29

+0

我很高兴这对你有用=) – 2013-08-14 16:28:58

相关问题