- PR -

WSADで作成したクラスのmainメソッドからDB2に接続できません

1
投稿者投稿内容
torakiyojp
常連さん
会議室デビュー日: 2004/08/04
投稿数: 23
投稿日時: 2004-08-18 10:06
お世話になっております。
Windows2000においてIBM Websphere Studio Application Developer(WSAD)で作成したクラスTestCallDBのmainメソッドで

Class.forName("COM.ibm.db2.jdbc.app.DB2Driver");

とすると以下のエラーが出ます。

java.lang.UnsatisfiedLinkError: SQLAllocEnv
at COM.ibm.db2.jdbc.app.DB2Driver.<init>(Unknown Source)
at COM.ibm.db2.jdbc.app.DB2Driver.<clinit>(Unknown Source)
at java.lang.Class.forName1(Native Method)
at java.lang.Class.forName(Class.java:142)
at test.TestCallDB.main(TestCallDB.java:11)

以下のページを参考にしましたがうまくいきませんでした。
http://www.sbpnet.jp/softwarepro/technical/art.asp?newsid=237

また、試しに、j2sdkでコマンドプロンプトより同じ内容のクラスを実行すると、うまくDB2に接続できました。

WSADの環境の設定がまずいように思えるのですが、何処の設定がまずいのかよくわかりません。
WSADのクラスパス変数"DB2_DRIVER_PATH"の設定は"C:/SQLLIB/java/db2java.zip"となっております。
DB2Driverの中で起きているエラーなので、このパスはあっているように思えます。
他にWSADで設定しなければならないものがあるのでしょうか?
mainメソッドによる実行ですので、ローカルのWebsphereサーバーの設定は関係ないように思えるのですが関係するのでしょうか?

ご存知の方がおりましたら、ご教授、よろしくお願いします。
ダメ猫
常連さん
会議室デビュー日: 2004/02/20
投稿数: 45
投稿日時: 2004-08-18 15:01
引用:

mainメソッドによる実行ですので、ローカルのWebsphereサーバーの設定は関係ないように思えるのですが関係するのでしょうか?



mainメソッドによる実行でも、サーブレットから動かした場合はサーブレットの設定を見に行くはずです。

サーブレットの中を見られるなら
java.lang.Class.forNameのソース見ることでどこの設定でエラーなのかが調べられると思います。
torakiyojp
常連さん
会議室デビュー日: 2004/08/04
投稿数: 23
投稿日時: 2004-08-18 17:04
ダメ猫様、解答ありがとうございます。

実行しているクラスTestCallDBですが、サーブレットではありません。

class TestCallDB {
public static void main(String args[]){
try {
System.out.println("Start");
Class.forName("COM.ibm.db2.jdbc.app.DB2Driver");
(以下略)

というように、Objectを継承しております。

エラー箇所ですが、デバッガで追うと、やはりDB2Driverの中で起きているようです。
SQLAllocEnvについても色々検索してみましたが、環境ハンドルの割り当てを行っているメソッドのようなものと認識しました。自信ありません。
そうすると、やはりWSADの設定ではないかと思うのですが・・・

引き続き、ご意見、お待ちしております。
シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2004-08-18 18:24
UnsatisfiedLinkErrorは、主にJNI用のネイティブライブラリのロードに失敗した場合に
発生します。
DB2のクラスのロードには成功したが、クラスイニシャライザ内部で行っているClassLoader#loadLibrary()の呼び出し時に、ライブラリ(Windows2000ですとおそら
く"SQLAllocEnv.dll"という名前)が見つからなかった、ということかと思います。

上記の名前のDLLを探して、WebSphereが探しに行ってくれる場所に配置してみてください。
skulker
ベテラン
会議室デビュー日: 2004/06/08
投稿数: 67
投稿日時: 2004-08-18 18:41
UnsatisfiedLinkErrorですから、DB2のネイティブAPIのコールが失敗しています。
Windows環境でしたら、PATHにDB2関連のDLL等のディレクトリが入っているか確認してください。
WSADのバージョンによるかもしれませんが、ネイティブのライブラリの設定があったと思います。パスを通さないのであればそちらに設定してください。

詳細はDB2かWSADのInfoCenterに出ていると思います。
torakiyojp
常連さん
会議室デビュー日: 2004/08/04
投稿数: 23
投稿日時: 2004-08-19 12:02
シュン様、skulker様、解答ありがとうございます。
解決しました。

やはりWSADの設定の問題でした。
WSAD上のプロジェクトのプロパティーの設定で"Javaのビルドパス"という項目があります。この項目の中に更に"順序およびエクスポート"という項目があるのですが、
ここで、"C:/SQLLIB/java/db2java.zip"の順序が他のプロジェクトへの参照より下にあると、

java.lang.UnsatisfiedLinkError: SQLAllocEnv

が出てしまうようです。
"C:/SQLLIB/java/db2java.zip"を他のプロジェクトへの参照より上に移動したところ、問題なく接続できました。

調べてみたところ、他のプロジェクトでもdb2java.zipを使っているのですが、このdb2java.zipとC:/SQLLIB/java/db2java.zipは別ものでした。
私としてはC:/SQLLIB/java/db2java.zipを読んで欲しかったのですが、他のプロジェクトのビルド順序の方が先の為、そちらのdb2java.zipが読まれていたようです。

一つのテスト用のプロジェクトで今回の問題以外のテスト等も色々行っていた為、2つのdb2java.zip存在するということになってしまいました。

ご指導、本当にありがとうございました。

1

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