本机库sqljdbc_auth.dll已装入到另一个类装入器中

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

加载的第一个工作正常,但第二个会引发异常:

Native Library sqljdbc_auth.dll already loaded in another classloader

当我将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

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

Class.forName("jdbc:sqlserver://<HOST>;databaseName=<DBNAME>;integratedSecurity=true;");

我该如何解决?


答案 1

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

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

|----------------------------------|
| sqljdbc*.jar     --> tomcat*/lib |
|----------------------------------|
| sqljdbc_auth.dll --> tomcat*/bin |
|----------------------------------|

答案 2

我认为你走在正确的轨道上。

对于命令行启动,您可以通过设置环境变量轻松解决java.library.path中的无sqljdbc_auth问题

CATALINA_OPTS=-Djava.library.path=/path/to/dll

如果将 tomcat 作为服务运行,请将“选项”参数更改为

HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Procrun 2.0\Tomcat7\Parameters\Java

包括:

-Djava.library.path=/path/to/dll

推荐