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しているもの