JDBCコネクションプール枯渇

先日、弊社業務のとあるインシデント対応によりデータの上書き処理を行うという作業が必要でした。

約250件のデータを画面上から1つ1つ開いて保存すればよいだけなのでやることは単純ですが、データ画面ロード → 保存までの処理が重く1分ほどかかるので全体で250分ほどかかる見込み、、、

4時間以上も行うのはあほらしいので絶対自動化したろうと思いパッケージAPI経由でSaveするツールを作りました。

 

ツール自体は簡単に作れたのですが実行したところ以下のエラーが、、、

 

■エラーメッセージ

Cannot resolve reference to bean 'DSConnection' while setting bean property 'baseServerConnection'; nested exception is org.springframework.beans.factory.BeanCreationException:Error createing bean with name 'DSConnection' defined in class path resource [Core.DataServer.clientconfig.xml]: Invocation of init method failed; nested exception is java.lang.RuntimeException: Error invoking service ejb:/dataserver//com.xxxxxxx.infra.admin.RemoteUserSession!com.xxxxxxx.infra.adminRemoteUserSession at remote://190.xxx.xxx.4447

 

あれ、150件くらいで試し実行したときはエラー起きなかったのになー?と思ってもう一度実行しなおしましたが変わらず同じエラーが吐き出されます。 

 

その後、アプリを起動して画面上からを処理を実行したところ以下のメッセージも表示されてしまい処理がされないことが分かりました。

■アプリ実行時のエラーメッセージ

java.sql.SQLException: javax.resource.ResourceException:IJ000453:Unable to get managed connection for java:jboss/datasources/ExampleDS

 

RedHatのサイトにも記載がありましたが、これはJDBCコネクションプールが枯渇してしまい新しいコネクションを割り振れないというエラーです。

Jbossの設定ファイルは見ていないが、おそらく設定は以下の通りだったと思います。

 

access.redhat.com

 

■設定

<max-pool-size>200</max-pool-size>

これにより接続が200以上になると制限を超過してしまい接続が行えなかった模様。

 

いやーやらかしました。時間待っていればコネクションが解放されると思いますが

急ぎだったので暫定的に一旦サーバ再起動してコネクションプールなど初期化しました。。。

 

今回のテストツールですが本当にやらかしました。

元々、処理ロジックは以下の通りでした。ただ、同じConnectionを使いまわすのでコネクションプールは枯渇しないと思っていましたが実際はdisconnectしないといけない?ようです。以下のように実装を修正しました。

 

■修正前ロジック

1. Connection生成

2. DBから更新対象情報取得

3. 更新対象情報を上書き保存

4. 2~3を繰り返す。

 

■修正後ロジック

1. Connection生成

2. DBから更新対象情報取得

3. 更新対象情報を上書き保存

4. Connectionをクローズする。

5. 1~4を繰り返す。

 

本当は繰り返さずにデータを用意してから最後に一括登録のほうが良いと思うのですが、それ用のAPIがパッケージに用意されておらずこの方法で行くことに

多分これでうまくいく、、、はず。(頼むぞ!)