OracleDataSource#getConnection()はコネクションが取得できないとNULLを返す??
JMeterを用いた負荷テストを行っている中で、
apacheの同時接続数を現行の90から180に変えて、
netstatのコネクション数*1が200になるようなテストを実行したところ、
WEBサーバ側の接続数が100を越えたぐらいからヌルポのエラーがログ上に流れまくり、原因調査で1日が終わってしまった。
stacktraceの出力を見ても、自前クラスが表示されておらず、どこでヌルポを返しているか分からなかった。
ログを見ていたOG氏が偶然、自前クラスの表記があるトレースを見つけていて、それがOracleDataSource#getConnection()だった。
ここを皮切りに、DB側のOracleのv$sessionを見たところ、セッションが10個しかなく、コネクションプーリングが最大10個で、負荷をかけた際に、10個全部使い切って、回らなくなった、要求したけど、取得できなくて、NULLを返すのではないかと仮説を立てて、MaxLimitを増やしてみたところ、見事エラーを返さずに処理が実行できた。
そしてさらに負荷をかけつづけたところ、APサーバのCPUが100%、同時接続数250、netstatの数270あたりで、WEBサーバが503を返すようになった。
まあ、現行運用で1日90を越えるか否かの数なので、
ここまで負荷はかからないだろうけどね。
DBがさらにOracleRACだったりするから、なんでJava側が20要求していて、実際は10個しかないんだ?と考えてしまったが、2個のインスタンスに対して半々で使っているんだった。
暗黙的接続キャッシュやOracleコネクションプールを使ったサンプルをもう少し早く見つけていれば、今日1日使い倒す事もなかったなあ。
*1:ポート80でestablishしているもの