catchでreturnしたらどうなる?

先週、あるお客のWEBアプリがログインできない障害が起きた。
業務復旧優先ということで、そのときはapacheを再起動して
なんとかなったのだが、
原因調査ということで、私がソースを眺めることになった*1
apacheのログを見るとコネクションを取得するときにnullが戻っているのが原因で、
そのクラスがクラスライブラリっぽく見えたので、


JDBCのバグかなあ?」*2
と思ったのだが、、どうもネットでぐぐっても、そのクラスが出てこないと思ったら、、
なんとそいつはライブラリクラスじゃなくてPGが作ったオリジナルと判明!*3
DBConnectionPoolとか、先入観でみちゃったよ。
こっそりパッケージしやがって。と心の中で舌打ちしつつ、
さらにソースを眺めていくとそいつはvectorでコネクションを自前でプールしていた。
なんか怪しい臭いがプンプンなのですが、


このクラス。
自前プールが空ならドライバーマネージャからコネクションをとり、
あれば自前プールから取り出し、カウンター変数をインクリメントして管理していた。
コネクションの取得、解放(というか返却?)はシンクロナイズで排他しているみたいだけど、、
この辺もなんかくさい*4
というか、コネクションプールとか自前でやらなきゃならないの??
DBサーバのOracle様に任せちゃえば良いのに。と思いつつ、


解放というか返却漏れじゃね?と予想して、返却メソッド*5を全ソースでGrep*6して、ひとつずつ洗い出しをしていくと、
catchの中で、『return -1』をしている箇所を6箇所ヒット。*7
問題の箇所は、finaryの中で、コネクションの返却をしていたので、
もし例外でcatchで飛んで、そのまま戻ったら、コネクションのインスタンスはクラス変数なので、GCで解放して自動クローズするけど、カウンター変数君*8は、デクリメントされずに、、


犯人は、お前がかおwrがmわ!!!!


と叫びつつ、私の頭の中では、finaryがあれば、最後に実行されるものだと思ったけど、
その前にreturnがあるとどうなるんだろう??という疑問もわいてきたので、
メモ帳に実験用のゴミプロを作っていざコンパイル!と思ったが、
この後客からQA電話とか、明日の会議の資料作成とか、お客さんに干されたりしていつもの時間になってしまった。


DLも終わったことだし、気を取り直してコンパイル!とDOSからJavacを実行したら、、
'javac' は、内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイルとして認識されていません。


このPC。JREしかはいってねー!orz
もう疲れたから双葉杏並にふて寝。


もう明日会社で確かめよう。
おやすみ。。

*1:ソースを眺めるのは下っ端の仕事だからねえ。というかおじさん達はソース読めない。。

*2:相手はバグバグ大王のOracle様なので、、

*3:telnetでソースなんてみちゃいけない

*4:@it掲示板でちょくちょく見るもので、、

*5:名前忘れた

*6:unix万歳!

*7:全体は30ぐらい

*8:コネクションを貸し出した数