バッチ処理などSQL文を大量に発行する時、気を付けないとORA-01000(最大オープン・カーソル数を超えました。)に遭遇してしまいます。
そもそも「最大オープン・カーソル数」は何かというと、セッション毎に同時に使用できる最大のカーソル数で、その値はデフォルト300(Oracle9i以降)で、この上限値を超えるとORA-01000が発生
するということです。
本来1つSQL文の実行が終わったらカーソルが解放するので、SQL文発行数がそもそも多いとか、SQL文自体の実行時間が長いなどいろんな原因でORA-01000が発生する場合、
大概の対策としては下記の2点になります。
1.プログラムを修正し、SQL発行数を減らす
2.DBの初期化パラメータOPEN_CURSORSの値を大きくする
ただ、今回はDBUtils + DBCP+JDBCドライバのバグ?により内部でオープンしたカーソルをクローズ失敗したせいで、オープンカーソル数が増え続ける、その結果ORA-01000になる現象を紹介しようと思います。
ドライババージョン JDBC Thin Driver 12.0.1.2
↓ここで問題が出ちゃう
oracle.jdbc.driver.OracleParameterMetaData.getParameterMetaData(OracleSql arg, Connection arg0, OraclePreparedStatement arg1)
対策としてはOracleのgetParameterMetaData()での例外を無視して、ちゃんとカーソルを解放するようにJDBCドライバを直してもらうようOracle社に頼むか、DBUtilsを使わないか。
getParameterMetaData()このメソッドにはいろんな問題が出てきますね、ORA-00942、ORA-00920などSQL文の書き方によりいろんな例外が出ます。DBUtilsとJDBCどっちが悪いか分からないですが、ちょっと勘弁してほしい。
そもそも「最大オープン・カーソル数」は何かというと、セッション毎に同時に使用できる最大のカーソル数で、その値はデフォルト300(Oracle9i以降)で、この上限値を超えるとORA-01000が発生
するということです。
本来1つSQL文の実行が終わったらカーソルが解放するので、SQL文発行数がそもそも多いとか、SQL文自体の実行時間が長いなどいろんな原因でORA-01000が発生する場合、
大概の対策としては下記の2点になります。
1.プログラムを修正し、SQL発行数を減らす
2.DBの初期化パラメータOPEN_CURSORSの値を大きくする
ただ、今回はDBUtils + DBCP+JDBCドライバのバグ?により内部でオープンしたカーソルをクローズ失敗したせいで、オープンカーソル数が増え続ける、その結果ORA-01000になる現象を紹介しようと思います。
ドライババージョン JDBC Thin Driver 12.0.1.2
↓ここで問題が出ちゃう
oracle.jdbc.driver.OracleParameterMetaData.getParameterMetaData(OracleSql arg, Connection arg0, OraclePreparedStatement arg1)
対策としてはOracleのgetParameterMetaData()での例外を無視して、ちゃんとカーソルを解放するようにJDBCドライバを直してもらうようOracle社に頼むか、DBUtilsを使わないか。
getParameterMetaData()このメソッドにはいろんな問題が出てきますね、ORA-00942、ORA-00920などSQL文の書き方によりいろんな例外が出ます。DBUtilsとJDBCどっちが悪いか分からないですが、ちょっと勘弁してほしい。