test example connecting java sql-server tomcat jdbc windows-integrated-auth

java - example - Biblioteca nativa sqljdbc_auth.dll ya cargado en otro cargador de clases



jdbc sql server windows authentication (3)

Tengo 2 aplicaciones web de Java que necesitan conectarse a la base de datos de SQL Server mediante la autenticación integrada de Windows.

El primero que se carga funciona bien, pero el segundo lanza la excepción:

Native Library sqljdbc_auth.dll already loaded in another classloader

El error anterior se produce cuando coloco el sqljdbc_auth.dll en una de las carpetas:

  • C: / WINDOWS / system32 /
  • C: / Archivos de programa / Apache Software Foundation / Tomcat 7.0 / bin /

Si coloco el sqljdbc_auth.dll en una de las carpetas a continuación:

  • / WEB-INF / lib directorio de cada aplicación web
  • C: / Archivos de programa / Apache Software Foundation / Tomcat 7.0 / lib /

Ambas aplicaciones lanzan la excepción:

Failed to load the sqljdbc_auth.dll cause :- no sqljdbc_auth in java.library.path

Estoy usando este código para cargar el controlador:

Class.forName("jdbc:sqlserver://<HOST>;databaseName=<DBNAME>;integratedSecurity=true;");

¿Cómo puedo resolverlo?


Cada aplicación web tiene su propio Classloader (aislándolos). Cuando llama al método Class.forName (), hay un bloque estático que intenta cargar la biblioteca compartida (archivo dll), por lo que ambas aplicaciones web intentan cargar la biblioteca compartida, por lo que aparece el mensaje de error cuando aparece la segunda. intenta cargar.

El jar de JDBC que tiene para sqlserver debe moverse de su paquete con sus guerras, a la carpeta tomcat 7.0/lib y copiar el sqljdbc_auth.dll a la carpeta tomcat / bin, de esta manera estará en el cargador de clases principal tomcat, y la clase Sólo se cargará una vez.

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


Creo que estás en el camino correcto.

Para el inicio de la línea de comandos, puede resolver fácilmente el problema no sqljdbc_auth en java.library.path estableciendo la variable de entorno

CATALINA_OPTS=-Djava.library.path=/path/to/dll

Si está ejecutando Tomcat como un servicio, cambie el parámetro Opciones bajo

HKEY_LOCAL_MACHINE/SOFTWARE/Apache Software Foundation/Procrun 2.0/Tomcat7/Parameters/Java

para incluir:

-Djava.library.path=/path/to/dll


El mismo error ocurre en Jasper Studio.

Probablemente no sea la mejor solución pero coloca el sqljdbc4.jar en C: / Archivos de programa (x86) / TIBCO / Jaspersoft Studio-6.1.0.final / features / jre.win32.win32.x86.feature_1.7.0.u80 / jre / lib / ext y el sqljdbc_auth.dll en C: / Archivos de programa (x86) / TIBCO / Jaspersoft Studio-6.1.0.final / features / jre.win32.win32.x86.feature_1.7.0.u80 / jre / bin

Y funcionará.