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

时间:2012-05-17 14:24:00

标签: java sql-server tomcat jdbc windows-integrated-auth

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

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

Native Library sqljdbc_auth.dll already loaded in another classloader

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

  • C:\窗口\ 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;");

我该如何解决?

3 个答案:

答案 0 :(得分: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 |
|----------------------------------|

答案 1 :(得分:1)

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

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

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

答案 2 :(得分: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 \中的sqljdbc_auth.dll仓

它会起作用。