java - native 库 sqljdbc_auth.dll 已在另一个类加载器中加载

标签 java sql-server tomcat jdbc windows-authentication

我有 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/

相关文章:

java - 如何编码(缩短)数字str

sql - sql中查找同一个表中连续两行之间的时间差

sql - 在 SQL 中存储当天的时间

禁用 Tomcat 7 取消部署按钮

java - 无法创建 PoolableConnectionFactory (未知数据库 'XYZ_DEV' )

java - 使用 Geotools 绘制的线串不正确

Java drawImage 在 Eclipse 中比编译时快得多

java - PreparedStatement 在 oracle 中执行成功但在 Microsoft SQL 中抛出异常

java - 我可以有多个文件夹,例如 webapps 并指定要访问哪个 ROOT.war 文件的域

java - 错误: package com. sun.tools.doclets.internal.toolkit.util不存在