本机库sqljdbc_auth.dll已经加载到另一个类加载器中

Gus*_*avo 20 java sql-server tomcat jdbc windows-authentication

我有2个Java Web应用程序需要使用Windows集成身份验证连接到SQL Server数据库.

加载的第一个工作正常,但第二个抛出异常:

Native Library sqljdbc_auth.dll already loaded in another classloader
Run Code Online (Sandbox Code Playgroud)

当我将sqljdbc_auth.dll放在其中一个文件夹中时,会出现上述错误:

  • C:\ WINDOWS\SYSTEM32 \
  • C:\ Program Files\Apache Software Foundation\Tomcat 7.0\bin \

如果我将sqljdbc_auth.dll放在下面的一个文件夹中:

  • 每个Web应用程序的/ WEB-INF/lib目录
  • C:\ Program Files\Apache Software Foundation\Tomcat 7.0\lib \

两个应用程序抛出异常:

Failed to load the sqljdbc_auth.dll cause :- no sqljdbc_auth in java.library.path
Run Code Online (Sandbox Code Playgroud)

我正在使用此代码加载驱动程序:

Class.forName("jdbc:sqlserver://<HOST>;databaseName=<DBNAME>;integratedSecurity=true;");
Run Code Online (Sandbox Code Playgroud)

我该如何解决?

Chr*_*ite 30

每个Web应用程序都有自己的Classloader(隔离它们).当您调用Class.forName()方法时,有一个静态块正在尝试加载共享库(dll文件) - 因此您的Web应用程序都试图加载共享库,因此第二个时会出现错误消息尝试加载.

您对sqlserver的JDBC jar应该从与您的战争捆绑在一起移动到该tomcat 7.0/lib文件夹并将sqljdbc_auth.dll复制到tomcat/bin文件夹 - 这样它将在tomcat父类加载器中,并且该类只会被加载一旦.

|----------------------------------|
| sqljdbc*.jar     --> tomcat*/lib |
|----------------------------------|
| sqljdbc_auth.dll --> tomcat*/bin |
|----------------------------------|
Run Code Online (Sandbox Code Playgroud)