2010-01-04 47 views
2

我正面临ORA-01000:尽管我正在关闭finally块中的结果集,但超出了最大打开游标。但我怀疑有一些麻烦我的遗留代码,下面是我的伪代码Java:ResultSet关闭策略,除了最后关闭之外

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

感谢任何帮助。

回答

6

你还没有说过你的finally块是什么,但如果它在while循环之外,那么是的,你有未封闭的结果集。 rs1变量将引用取回的“最新”结果集 - 所以这是唯一将被关闭的结果集。这里没有什么不可思议的 - 这只是变量的正常行为。

我建议你将每个“获取结果集并使用它”情况分离到它自己的方法中,并在该方法中的try/finally块中关闭结果集。这将很清楚发生了什么事情。

+1

+1“没有什么不可思议的东西在这里”。 :-) – 2010-01-04 10:12:27

+0

是的,我的finally块在while循环之外。我将更改我的代码以使用单独的结果集,但出于好奇,无论如何要关闭上述代码中的所有结果?如果我在将它用于query2之前关闭rs1,它会有帮助吗? – 2010-01-04 10:14:59

+1

@Ravi - 在完成第一个ResultSet之后,显式的'rs1.close()'可以做到这一点。 (在关闭的ResultSet中调用'close()'被定义为no-op,所以你不必担心外部'finally'块中的double关闭。) – 2010-01-04 11:28:18