きどたかのブログ

いつか誰かがこのブログからトラブルを解決しますように。

クラスロードしてくれるな

前から気になってたことがまた気になり始めた。


WebSphereのデータソースおよびそのJDBCプロバイダで、どうしても変だなと思う事がある。


有効範囲がサーバーで、JDBCプロバイダとして、DB2 のUniversal Driverと、DB2のJCC Driverを定義してます。これらの違いは、クラスパスに含めるのが、db2jcc.jarなのか、db2jcc4.jarなのかです。


では、JCC Driverで有効範囲がサーバーのところにデータソースを作ったとします。ただし、db2jcc4.jarは実際には配置してありません。
その状態でアプリケーションを動かすと、Universal Driverで動いてしまうのです。
また、これはデータソースのテスト接続すらもUniversal Driverで動くのです。
これは、スタンドアロンアプリケーションサーバーで起きてます。セル構成ではどうなるかしっかり見てません。


頼むからエラーになって欲しいんだよなー。


これは私の拙い調査では、クラスロードの問題と結論付けてます。
クラスローダー・ビューワーを見ると、ブーストラップ拡張クラスローダーでドライバーを読んでいます。
見たところ、db2jcc.jarもdb2jcc4.jarも同一のこのクラスローダーで読まれています。
有効範囲がサーバーに、JDBCプロバイダの異なるデータソースを定義する際に、この問題が起因して予期しないエラーになることも考えられます。
たとえばバージョンが少し違うJDBCドライバーを定義すると困ったことになるのが簡単に予想されます。


確か、oracle 11gにWebSphereが対応して、11g用のデータストアヘルパーが出来た頃、だいたいちょうど1年くらい前、似たような問題で困った記憶があります。


oracle10gのojdbc14.jarと、oracle11gのojdbc5.jarを有効範囲がサーバーの箇所にJDBCプロバイダをそれぞれ作りました。
そのJDBCプロバイダを使って、データソースを作ったのです。
しかし、oracle11gのデータソースは、テスト接続をしても実際に使われるのはojdbc14.jarでした。
アプリを動かしてもojdbc5.jarを使っている様子がありませんでした。
その時、自分のローカル環境では、oracle11g用の定義以外は全て消す方法を試しました。
データソースはもちろん、JDBCプロバイダ、果てはWebSphere変数までです。
そこまで徹底するとさすがにojdbc14.jarを読むことは無くなりました。
たしかその時、データソースを削除するだけでは、ojdbc14.jarが読まれてしまう事象は抑え込めませんでした。



一年経ってもなんで改善されないのだろうか??
これは仕様であると言ってるのだろうか??
仕様と言われても、これは受け入れがたい仕様だと思わないかい?
db2jcc.jarとdb2jcc4.jarを使いたいならサーバーを分けろと!?
バージョンアップしたドライバを使いたいならサーバーを分けろと!?
これらはEARライブラリやWARライブラリに入れれば回避出来るのだろうけど、
テスト接続に関してはどうしようもない。



環境を合わせるため(特にJDBCドライバについて)にDB2 Express-C v9.5.2を探してるのだが、
なんかtar.gzが見つからなくて困ってる。
clientはあったんで、入れてみたらドライバーバージョンが古いでやんの。
環境を合わせたいのに別のが動くんじゃあイヤだからすぐにアンインストールした。
方法として考えられるのは、バージョンの同じドライバーのみを入れる方法と、
バージョンの同じDB2 Express-Cを入れる方法だ。
IBMのサイトが賢くて古いのが手に入れられない。。。
普段なら喜ばしい配慮ではあるのが・・・。
えーと、しょうがないから、初めにうちの環境にDB2入れたメンバーに聞いて回ろう。
少なくとも僕の知ってるLinux環境はfind / -nameで全て調べた。
あとは職場のファイルサーバのどこかに残ってることを祈る。
v8.1とv9.7はあったんだけどな…。


ちなみに昨日ぶちあたった、環境を変えたらNOT NULL制約にひっかかる問題は、
どうやらデータベースのデータが合ってなかったらしい。
ちゃんと例外になっていたんだが、e.printStackTrace()してるもんだから、
SystemOut.logに出てなくてオレが気付かなかったのだ。
でも、SystemErr.logの内容って、SystemOut.logに出てるもんだと思ったらそうでもないのか。
うーん、盲点に気付けなかった自分が不甲斐ない。
でもさー、小言を言っていいかな、、、ロガー使ってくれよ(泣
いちおう最終的には、成功する環境のログと、失敗する環境のログを取得して、
不要な部分は削除して、Diffを取ってみたら、開始ログがあるのに終了ログが出てないところがあった。
ふぅ・・・、やっぱり、自分で作ってないアプリのログを見るのってキツイよな、
ここまでやらないと「不自然だ」って気付けない。
自分で作ってたら気付けるよ、こんなのはさー。