我有 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-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;");
我该如何解决?
最佳答案
每个 Web 应用程序都有自己的 Classloader(隔离它们)。当您调用 Class.forName() 方法时,有一个静态 block 正在尝试加载共享库(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 |
|----------------------------------|
关于java - native 库 sqljdbc_auth.dll 已在另一个类加载器中加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10637585/