【问题标题】:Java: ResultSet closing strategy, apart from closing it in finallyJava:ResultSet关闭策略,除了在finally中关闭它
【发布时间】:2010-01-04 09:52:21
【问题描述】:

我面临 ORA-01000:尽管我正在关闭 finally 块中的结果集,但已超出最大打开游标。但我怀疑我的遗留代码有问题,下面是我的伪代码

while (someCondition) {
rs1=executePreparedStatementNew(query1,param1,""); 
//do something with rs1
rs1=executePreparedStatementNew(query2,param2,""); 
}
  1. 如果循环运行 5 次,这段代码将打开多少个游标?
  2. 如果我最后关闭rs1,会关闭多少游标,有人说query1的rs1实例不会被关闭,因为它被query2实例屏蔽了。
  3. 结果集真的会以这种方式被屏蔽吗,如果是,如何确保所有实例都已关闭。

感谢任何帮助。

【问题讨论】:

    标签: java database oracle jdbc cursors


    【解决方案1】:

    你还没有说你的 finally 块在哪里,但是如果它在 while 循环之外,那么是的,你 有未关闭的结果集。 rs1 变量将引用获取的“最新”结果集 - 所以这是唯一将被关闭的结果集。这里没有发生什么神奇的事情——这只是变量的正常行为。

    我建议您将每个“获取结果集并使用它”的情况分开到它自己的方法中,并在该方法内的 try/finally 块中关闭结果集。这将使发生的事情变得相当清楚。

    【讨论】:

    • 是的,我的 finally 块在 while 循环之外。我将更改我的代码以使用单独的结果集,但出于好奇,是否有关闭上述代码中的所有结果?如果我在将 rs1 用于 query2 之前关闭它会有帮助吗?
    • @Ravi - 是的,在您完成第一个 ResultSet 之后,明确的 rs1.close() 就可以了。 (在关闭的 ResultSet 上调用 close() 被定义为无操作,因此您不必担心外部 finally 块中的双重关闭。)
    猜你喜欢
    • 2016-07-17
    • 1970-01-01
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-02
    • 2010-09-12
    • 1970-01-01
    相关资源
    最近更新 更多