反省の念をこめて直ったアレのことを
僕が3年前Javaのプロジェクトに入ったときに初めてだからと言って如何にモノを知らなかったことか。経験があるはずなのに僕よりモノを知らない人がたくさんいるのにも茫然としたけれど、そうは言ってもアレがわからなかったのはやっぱり僕に知識もカンも足りなかったからだ。
事象
WebSphere Application Server(以下WAS)のコネクションプールを使ってOracleの索引つき表の機能を使ったらタマにStaleConnectionExceptionが出るようになる
コネクションの使い方
コネクションプールから拾ってきたコネクションでprepareCallして戻ってきたCallableStatementをOracleCallableStatementにキャストしようとしたらClassCastExceptionが出るんだぜ。そうか、WASのプールのUtilのgetNativeConnectionを使ってOracleConection取ってくればできるぜ!⇒StaleConnectionExceptionが出たぜ
当時の対応
何でかわかんないから索引つき表を使うときはConectionPool使わないようにしようぜ(非常に乱暴)
今日発覚した事実
大雑把に書くと
- Connectionの変数にプールからのコネクションを代入
- それを更にgetNativeConnecion()で取得したものに上書き
- それを使い終わったら閉じる
ってコネクションプールから貰ったコネクション実体を勝手に閉じちゃダメだろうよと。
話がわかるようになってから見るとこんなに自明的な誤りが当時は全然わからなかった。プロジェクト全体でも。酷い話だ。自分が中心になって対応したものじゃないとはいえ、その当時もう少し何が起きているかを理解するように努力すべきだったんだよなあ。