首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Java 使用 Oracle 遇到 ORA-01000 最大游標超出:根因與徹底解決

     編輯:Oracle 資料庫相關知識

許多 Java 開發者在使用 Oracle 時遭遇 ORA-01000: maximum open cursors exceeded。錯誤本質是程式碼未正確關閉游標,而非參數不足。單純調大 open_cursors 只能治標不治本。

錯誤成因

  • conn.createStatement()、conn.prepareStatement() 在資料庫端會開啟一個游標。
  • 若這些呼叫置於迴圈內部,且未及時關閉,游標會快速耗盡。
  • 即使不在迴圈,若執行完查詢/更新後未關閉 Statement/ResultSet,游標也會洩漏。

正確程式碼模式

// 1. Statement/PreparedStatement 放在迴圈外部
PreparedStatement pstmt = conn.prepareStatement("SELECT ... WHERE id = ?");
try {
  for (int id : ids) {
    pstmt.setInt(1, id);
    ResultSet rs = pstmt.executeQuery();
    try {
      while (rs.next()) { /* 處理資料 */ }
    } finally {
      rs.close(); // 立即關閉 ResultSet
    }
  }
} finally {
  pstmt.close(); // 最後關閉 Statement
}

核心原則

  1. 建立 Statement/PreparedStatement 在迴圈外,重複使用。
  2. 用完即關:執行完 executeQuery/Update,若不再需要 ResultSet,立即 close()。
  3. 使用 try-with-resources (Java 7+) 或 finally 區塊確保資源釋放。
  4. 連線池設定 maxOpenPreparedStatements 避免洩漏擴散。

關於 open_cursors 參數

  • 絕大多數系統預設值 (300/500) 已足夠。
  • 只有極特殊高併發場景才需調大,且必須配合程式碼修正。
  • 監控 V$SESSTAT / V$SYSSTAT 中 opened cursors current 觀察實際用量。

徹底解決 ORA-01000 的唯一出路是修正程式碼資源管理,而非調大參數掩蓋問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved