Windows統合認証を使用してSQL Serverデータベースに接続する必要がある2 Java Webアプリがあります。
ロードされた最初のものは正常に動作しますが、2番目のものは例外をスローします。
Native Library sqljdbc_auth.dll already loaded in another classloader
上記のエラーは、sqljdbc_auth.dllをいずれかのフォルダに配置すると発生します。
Sqljdbc_auth.dllを次のいずれかのフォルダに配置すると、
どちらのアプリも例外をスローします。
Failed to load the sqljdbc_auth.dll cause :- no sqljdbc_auth in Java.library.path
このコードを使用してドライバーをロードしています:
Class.forName("jdbc:sqlserver://<Host>;databaseName=<DBNAME>;integratedSecurity=true;");
どうすれば解決できますか?
各Webアプリケーションには独自のクラスローダーがあります(それらを分離します)。 Class.forName()メソッドを呼び出すと、共有ライブラリ(dllファイル)をロードしようとしている静的ブロックがあるため、両方のWebアプリが共有ライブラリをロードしようとしているため、2つ目のエラーメッセージがロードしようとします。
Sqlserver用に持っているJDBC jarは、warにバンドルされているものからTomcat 7.0/lib
フォルダーに移動し、sqljdbc_auth.dllをTomcat/binフォルダーにコピーする必要があります。これにより、Tomcat親クラスローダーと、クラスは一度だけロードされます。
|----------------------------------|
| sqljdbc*.jar --> Tomcat*/lib |
|----------------------------------|
| sqljdbc_auth.dll --> Tomcat*/bin |
|----------------------------------|
私はあなたが正しい軌道に乗っていると思います。
コマンドライン起動の場合、環境変数を設定することでJava.library.pathにsqljdbc_authがない問題を簡単に解決できます
CATALINA_OPTS=-Djava.library.path=/path/to/dll
Tomcatをサービスとして実行している場合は、Optionsパラメータを
HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Procrun 2.0\Tomcat7\Parameters\Java
含める:
-Djava.library.path=/path/to/dll
Jasper Studioでも同じエラーが発生します。
おそらく最良の解決策ではありませんが、sqljdbc4.jarをC:\ Program Files(x86)\ TIBCO\Jaspersoft Studio-6.1.0.final\features\jre.win32.win32.x86.feature_1.7.0.u80\jre \に配置しますC:\ Program Files(x86)\ TIBCO\Jaspersoft Studio-6.1.0.final\features\jre.win32.win32.x86.feature_1.7.0.u80\jre\binにあるlib\extおよびsqljdbc_auth.dll
そしてそれはうまくいきます。