一尘不染

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

tomcat

我有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;");

我该如何解决?


阅读 294

收藏
2020-06-16

共1个答案

一尘不染

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

您应将用于sqlserver的JDBC jar从与war捆绑在一起的位置移到该tomcat 7.0/lib文件夹,然后将sqljdbc_auth.dll复制到tomcat / bin文件夹-
这样,它将位于tomcat父类加载器中,并且仅会加载该类一旦。

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