ORA-01000: maximum open cursors exceeded
表示單一 Process 開啟的游標數超過參數 OPEN_CURSORS 限制(預設 50~300)。
conn.createStatement() 或 conn.prepareStatement() 都在資料庫端開啟一個游標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=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。