2010-01-04 82 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