24

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

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

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-INF/lib 每个 Web 应用程序的目录
  • 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;");

我该如何解决?

4

3 回答 3

34

每个 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 |
|----------------------------------|
于 2012-05-17T23:54:06.073 回答
1

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

对于命令行启动,您可以通过设置环境变量轻松解决java.library.path 中 no 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
于 2012-05-18T10:30:30.393 回答
0

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\ lib\ext 和 C:\Program Files (x86)\TIBCO\Jaspersoft Studio-6.1.0.final\features\jre.win32.win32.x86.feature_1.7.0.u80\jre\bin 中的 sqljdbc_auth.dll

它会起作用。

于 2016-08-24T06:16:23.523 回答