- PR -

tomcat5 クラスロード SVF

1
投稿者投稿内容
takii
会議室デビュー日: 2004/10/19
投稿数: 3
投稿日時: 2006-03-02 01:55
SVFを使用したWebを開発しています。

環境
APサーバ:tomcat5 on Linux
SVFサーバ:on Linux(tomcatと同じサーバ)
DBサーバ:Oracle8 on Win2000

<問題>
APの一般処理は行える(DBに接続して値を取得して、画面に表示とか)が、
APのSVF印刷実行時は、Oracleドライバが見つからないエラーになる。

<補足>
oracle14.jarはWEB_INF/lib直下に配置している。
tomcatのsetclasspath.shではCLASSPATHにjava/lib/toojarとsvf.jarを設定している。
APのフレームワークはClass.forName()を使ってドライバをロードしている。

<いやいや回避策>
setclasspath.sh にoracle14.jarを追加する。

SVFがドライバを見つけれないのが謎です。
SVFがSVFクエリを実行するときにWebappClassLoaderを使わないため?

よろしければご意見お願いいたします。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2006-03-02 02:37
クラスローダには親子関係があります。
そこで以下の制約が生まれます
・子クラスローダから親クラスローダのクラスは見える
・親クラスローダから子クラスローダのクラスは見えない
これにより複数の子クラスローダで同じ名前のクラスを別々の空間で読み込むことができる仕組みになっています。
今回の場合 Web アプリケーションのクラスローダで読み込まれるクラスを、親クラスローダから読み込めないために発生します。
なので、JDBCドライバを使いたいクラスが存在するのと同じかそれより親のクラスローダでJDBCドライバが読み込めないといけません。
svf.jar と同じく起動時のクラスパスにJDBCドライバを通すのも良いですし、svf.jar を WEB-INF/lib に配置しても良いです。
解決策としては至極まっとうですので安心してください。
こちら↓のスレッドもやや参考になるかもしれません。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=15194&forum=12&start=8
takii
会議室デビュー日: 2004/10/19
投稿数: 3
投稿日時: 2006-03-13 21:38
インギ様
返事遅くなり申し訳ありません(忙しすぎて・・・)。

インギ様のアドバイスでうまくいきました。ありがとうございます。
(その後も別件でいろいろはまっていたのですが)
何とかリリースはできました。

Javaはある程度、知ってるつもりでしたが奥が深いですね。
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2006-03-13 23:19
TomcatではJDBCドライバ等は/common/libに配置するのがいいでしょう。
特にJDBCドライバは同一VMで複数回ロードされると微妙なので、
サーバー側、Webアプリ側の双方で共有する形の方が安全です。

Class Loader HOW-TOが参考になると思います(日本語訳もあったはず)。
1

スキルアップ/キャリアアップ(JOB@IT)