首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Java 連線 Oracle 常見 ORA-01000 最大游標超出錯誤根因與解決之道

     編輯:Oracle 資料庫基礎

錯誤現象

ORA-01000: maximum open cursors exceeded

表示單一 Process 開啟的游標數超過參數 OPEN_CURSORS 限制(預設 50~300)。

根本原因:代碼資源洩漏

  • 每次呼叫 conn.createStatement() 或 conn.prepareStatement() 都在資料庫端開啟一個游標
  • 若在迴圈中重複建立 Statement 卻未關閉,游標數快速飆升
  • 執行 executeQuery/executeUpdate 後未關閉 ResultSet、Statement,游標持續佔用

正確寫法範例

// 準備階段:在迴圈外建立 PreparedStatement
String sql = "UPDATE T SET COL=? WHERE ID=?";
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
  for (Data d : list) {
    pstmt.setString(1, d.getCol());
    pstmt.setInt(2, d.getId());
    pstmt.addBatch();          // 批次處理更高效
  }
  pstmt.executeBatch();        // 一次性送出
} // try-with-resources 自動關閉 pstmt,釋放游標

為何單純調大 OPEN_CURSORS 非良方

  • 治標不治本,代碼洩漏依然存在,終會再次觸頂
  • 過大參數掩蓋效能問題,延遲發現設計缺陷
  • 多數系統 OPEN_CURSORS=200~500 即足夠,僅極特殊場景需調大

檢查與監控

-- 查看當前會話開啟游標數
SELECT S.SID, S.USERNAME, COUNT(*) AS OPEN_CURSORS
FROM V$OPEN_CURSOR C, V$SESSION S
WHERE C.SID = S.SID
GROUP BY S.SID, S.USERNAME
ORDER BY 3 DESC;

總結

嚴格遵守「建立在迴圈外、用完即關閉、善用 try-with-resources、批次處理減少往返」四原則,即可從根源杜絕 ORA-01000。

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