🔍 エラー概要
項目 | 内容 |
エラーコード | ORA-01000 |
メッセージ | 最大オープン・カーソル数を超えました |
発生原因 | 開いたカーソルをクローズせずに処理を繰り返した結果、open_cursors の上限に達した |
対応優先度 | 高(アプリケーション修正・設定見直しが必要) |
🧠 原因と仕組み
Oracle では、SQL 実行時に「カーソル」という内部ハンドルを使用して SQL 文を管理します。
アプリケーションが PreparedStatement
や ResultSet
を閉じずに再利用し続けると、未解放のカーソルが蓄積し、open_cursors
パラメータで設定された上限値を超えた時点で ORA-01000 が発生します。
🧩 よくある原因パターン
原因 | 詳細 |
JDBCのクローズ漏れ | ResultSet や Statement を close() していない |
ループ内で毎回 SQL を prepare | PreparedStatement を都度生成して再利用していない |
コネクションプールの設定ミス | コネクションが正しく解放されず、カーソルが残存 |
長時間実行バッチ | 同一セッションで大量SQLを連続実行してカーソルが累積 |
外部ライブラリのバグ | ORM(MyBatis、Hibernate等)でのカーソル管理不具合 |
🧭 対処法(順序付き)
手順 | 対処内容 |
① | アプリケーションコードを点検(ResultSet, Statement, Connection を確実に close) |
② | try-with-resources 構文を使用して自動クローズ化(Java7以降推奨) |
③ | open_cursors パラメータ値を確認(show parameter open_cursors;) |
④ | 必要に応じて上限を引き上げ(例:ALTER SYSTEM SET open_cursors = 1000 SCOPE=BOTH;) |
⑤ | v$open_cursor ビューで調査(どのSQLが残っているか確認) |
🔧 調査SQL例
💡 Javaでの修正例(try-with-resources構文)
✅ これにより、ResultSet
・PreparedStatement
・Connection
が自動的にクローズされます。
⚙️ open_cursors の推奨設定値
システム規模 | 推奨値 | 備考 |
開発・検証環境 | 300〜500 | 検証負荷に応じて柔軟に設定 |
小〜中規模業務システム | 500〜1000 | 通常アプリでは十分 |
大規模バッチ・Webサービス | 1000〜2000 | コネクションプール利用時に余裕をもたせる |
🚨 注意点
✅ まとめ
観点 | 内容 |
発生原因 | カーソルの未クローズや過剰生成 |
一時対応 | open_cursors の増加 |
根本対応 | コード修正(try-with-resources等) |
チェック方法 | v$open_cursor / v$sesstat ビュー |
再発防止 | コーディング規約・静的解析の導入 |