我有2个Java Web应用程序,需要使用Windows集成身份验证连接到SQL Server数据库。
加载的第一个可以正常工作,但是第二个抛出异常:
Native Library sqljdbc_auth.dll already loaded in another classloader
当我将sqljdbc_auth.dll放在以下文件夹之一中时,会发生上述错误:
如果将sqljdbc_auth.dll放在以下文件夹之一中:
这两个应用程序都抛出异常:
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()方法时,有一个静态块正在尝试加载共享库(dll文件)-因此,您的两个Web应用程序都试图加载共享库,因此在第二个加载时出现错误消息尝试加载。
您应将用于sqlserver的JDBC jar从与war捆绑在一起的位置移到该tomcat 7.0/lib文件夹,然后将sqljdbc_auth.dll复制到tomcat / bin文件夹- 这样,它将位于tomcat父类加载器中,并且仅会加载该类一旦。
tomcat 7.0/lib
|----------------------------------| | sqljdbc*.jar --> tomcat*/lib | |----------------------------------| | sqljdbc_auth.dll --> tomcat*/bin | |----------------------------------|