概要
SQL実行時に Oracle データベースサーバ のダウン等により例外が発生した後、JDBCコネクションのクローズを呼び出すとJDBCコネクションがリークし、システムダウンに繋がる。
影響のある製品
- WebOTX Web Edition V6.1~V6.5
- WebOTX Standard-J Edition V6.1~V6.5
- WebOTX Standard Edition V6.2~V6.5
- WebOTX Enterprise Edition V6.2~V6.5
- WebOTX Application Server Web Edition V7.1~V8.1
- WebOTX Application Server Standard-J Edition V7.1~V8.1
- WebOTX Application Server Express V8.2~V10.2 (※)
- WebOTX Application Server Foundation V8.2~V8.5
- WebOTX Application Server Standard V7.1~V10.2
- WebOTX Application Server Enterprise V7.1~V9.5
- WebOTX Enterprise Service Bus V6.4~V8.5
- WebOTX Portal V8.2~V9.1
- (※)WebOTX Enterprise Service Bus V9.2~V10.1、および、WebOTX Portal V9.3~V10.1にバンドルされているWebOTX Application Server Expressを使用している場合にも該当します。
詳細
次の条件を全て満たす場合、データベースサーバが停止中などの理由でSQL実行時に例外が発生すると、Oracle JDBC ドライバのバグ(Bug: 27704005)に起因してJDBCコネクションが WebOTX のコネクションプールに返却されないままとなります。
- Oracle JDBC Driver 12.1.0.1 以降、19.3.0未満のバージョン を使用(※)
- JDBCデータソースでデータソース種別に"JDBCEX_Oracle"を選択
JDBCデータソースの最大プールサイズを指定していると、JDBCコネクションがコネクションプールに返却されないことで有効なJDBCコネクションの数が減少し、最終的にデータベースサーバと通信できない状況となります。
(※)本問題はOracle JDBC Driver 19.3.0 で修正されたため、19.3.0以降をご利用の場合は該当しない点、ご注意ください。
事象が発生した場合、次のメッセージがログに出力され続けます。
[NEC][WOJDBC] Timeout occurred while waiting for free connection
JDBCデータソースでデータソース種別に"JDBCEX_Oracle"を選択しているかは、次のコマンドでご確認いただけます。
otxadmin> login --user <ユーザ名> --password <パスワード> --host <ホスト名> --port <対象ドメインの管理ポート>
otxadmin> get server.resources.jdbc-datasource.<JNDIサーバへの登録名>.dataSourceType
※JNDIサーバへの登録名の例:jdbc/Oracle
ご利用の Oracle JDBC ドライバのバージョンは、ojdbc*.jarに含まれる META-INF\MANIFEST.MF内のImplementation-Version の表記でご確認頂けます。
対処方法
WebOTXで使用しているJDBCドライバに、Oracleのパッチ(Patch:27704005)を適用してください。
回避方法
2フェーズコミットを利用している場合には回避方法はありませんので、WebOTXで使用しているJDBCドライバに、Oracleのパッチ(Patch:27704005)を適用してください。
JDBCリソースが登録されていて、2フェーズコミットを利用していない場合、次の手順1.と2.を実施してください。
- データソースの種別を"JDBC API"(コマンドでは"JDBC")に変更してください。
運用管理ツールの場合:
-[WebOTX管理ドメイン[<ホスト名>]]
-[<ドメイン名>]
-[リソース]
-JDBCデータソース
-[<JNDIサーバへの登録名>] (例:jdbc/Oracle)
データソースの種別 を "JDBC API"に変更
運用管理コマンドの場合:
otxadmin> login --user <ユーザ名> --password <パスワード> --host <ホスト名> --port <対象ドメインの管理ポート>
otxadmin> set server.resources.jdbc-datasource.<JNDIサーバへの登録名>.dataSourceType=JDBC
- V8.3以前の場合は設定変更後、ドメインもしくはプロセスグループの再起動を行ってください。
詳細は下記の[ドメインもしくはプロセスグループの再起動]をご確認ください。
V8.4以降の場合はデータソースの種別の変更後、次の操作により設定内容変更の反映を行ってください。
運用管理ツールの場合:
[WebOTX管理ドメイン[<ホスト名>]]
-[<ドメイン名>]
-[リソース]
-JDBCデータソース
-[<JNDIサーバへの登録名>] (例:jdbc/Oracle)
にて「設定変更内容の反映」を実行
運用管理コマンドの場合:
otxadmin> login --user <ユーザ名> --password <パスワード> --host <ホスト名> --port <対象ドメインの管理ポート>
otxadmin> publish-jdbc-datasource <JNDIサーバへの登録名>
[ドメインもしくはプロセスグループの再起動]
- Express エディション(Webエディション)の場合
プロセスグループはありませんので、次のコマンドにてドメインを再起動することにより反映してください。
V6~V8.1の場合:
otxadmin> stop-domain <ドメイン名>
otxadmin> start-domain <ドメイン名>
V8.2以降の場合:
otxadmin> login --user admin --password <パスワード> --host <ホスト名> --port 6202
otxadmin> stop-domain --remote=true <ドメイン名>
otxadmin> start-domain --remote=true <ドメイン名>
- その他のエディションの場合
アドバンスドモード か スタンダードモード(V6.x もしくは V7.1 であれば、マルチプロセスモード か シングルプロセスモード)で反映方法が異なります。
アドバンスドモード(マルチプロセスモード)か、スタンダードモード(シングルプロセスモード)かは次のotxadmin コマンドで確認することが可能です。
otxadmin> login --user <ユーザ名> --password <パスワード> --host <ホスト名> --port <対象ドメインの管理ポート>
otxadmin> get server.web-container.processMultiplicity
true :アドバンスドモード(マルチプロセスモード)
false :スタンダードモード(シングルプロセスモード)
- スタンダードモード(シングルプロセスモード)の場合
上述のExpress エディション(Webエディション)の場合と同様にドメイン再起動により設定を反映します。
- アドバンスドモード(マルチプロセスモード)の場合
次のコマンドにてプロセスグループの再起動により設定を反映します。
otxadmin> login --user <ユーザ名> --password <パスワード> --host <ホスト名> --port <対象ドメインの管理ポート>
otxadmin> stop-pg --apgroup <アプリケーショングループ名> <プロセスグループ名>
otxadmin> start-pg --apgroup <アプリケーショングループ名> <プロセスグループ名>
回避方法の影響
データソースの種別を"JDBC API"(コマンドでは"JDBC")に変更した場合は、1フェーズコミットのみ実行可能で、2フェーズコミットが利用できなくなる点にご注意ください。
関連情報
備考
更新履歴
2023/10/03 更新
2019/05/17 初版