Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java jdbc和oracle-超过最大打开游标数_Java_Oracle_Jdbc - Fatal编程技术网

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

java jdbc和oracle-超过最大打开游标数,java,oracle,jdbc,Java,Oracle,Jdbc,我有一些从Oracle检索数据的JDBC代码 在我的方法中,我使用一个准备好的语句,但是我不关闭那个准备好的语句。 为了测试它,我在一个循环中运行了它,果然得到了一个异常: ORA-01000: maximum open cursors exceeded 我的问题是对于托管环境(使用连接池部署在Java EE应用服务器上的代码): 应用程序会发生什么情况 除非连接被关闭/回收,否则它永远无法向数据库发出任何SQL查询吗?(假设池中只有1个连接) 我假设池中的连接没有真正关闭-oracle会

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

在我的方法中,我使用一个准备好的语句,但是我不关闭那个准备好的语句。 为了测试它,我在一个循环中运行了它,果然得到了一个异常:

ORA-01000: maximum open cursors exceeded
我的问题是对于托管环境(使用连接池部署在Java EE应用服务器上的代码):

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

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

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

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

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

您可以使用以下方法增加允许打开的游标

“ALTER SYSTEM SET OPEN_CURSORS=2000 SID=’DUMMY’”;
但上述情况并不能解决问题。要修复它,您需要关闭您的连接/结果集/PreparedStatements等


如果连接池中允许的活动连接数小于数据库允许的连接数,则应用服务器将无法发送SQL请求的一种可能情况

必须关闭准备好的语句,否则将无法执行更多查询

假设你有:

        PreparedStatement ps = conn.prepareStatement("select * from my_table");
        ps.execute();
        ps.close();
您必须执行ps.close来避免这个问题。正如我@Stephen所说的,还要关闭结果集

    ResultSet rs = ps.executeQuery();

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

感谢Ziggy,在托管环境中,一旦我达到最大光标问题,是否意味着除非我跳出/启动/停止应用程序服务器,否则我将无法执行查询?我明白,如果我不关闭连接,池中的所有连接最终都会被消耗,应用程序将停止,我们将被迫重新启动应用程序服务器是的,正确,因为如果你弹出应用程序服务器,你就释放了这些资源。谢谢Zigy,我将使用应用程序服务器进行尝试,看看结果如何影响是如果我不关闭结果集和准备好的语句Hanks Stephen-是的,这一部分是关于如何防止这种情况发生的-我的问题更多的是关于如果发生这种情况会产生什么影响-这是否像泄漏的连接一样会使应用程序停止-但是如果是泄漏的游标-会带来什么影响应用程序陷于停顿?@akila-泄漏
ResultSet
对象(即未能关闭它们)将导致查询失败,这可能导致应用程序陷于停顿。谢谢-我想我将使用一些应用程序服务器来尝试这一点,并确认几天来一直在寻找这个答案。你所说的是第一个有意义的答案。谢谢你,你帮我调试了我的程序。我很高兴这对你有用=)