2011-12-18 49 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

相關問題