2012-05-17 33 views
17

Tengo 2 aplicaciones web java que necesitan conectarse a la base de datos de SQL Server utilizando la Autenticación integrada de Windows.Biblioteca nativa sqljdbc_auth.dll ya cargada en otro cargador de clase

El primero que se carga funciona bien, pero la segunda 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: \ Fundación archivos de programa \ Apache Software \ Tomcat 7.0 \ bin \

Si coloco el sqljdbc_auth.dll en una de las carpetas siguientes:

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

Ambas aplicaciones emitir 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?

Respuesta

26

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

El tarro de JDBC que tiene para sqlserver debe pasar de ser incluido con sus guerras, a la carpeta tomcat 7.0/lib y copiar la carpeta a sqljdbc_auth.dll tomcat/bin - de esta manera será en el cargador de clases padre Tomcat, y el la clase solo se cargará una vez.

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

Como dije en mi pregunta intenté poner la DLL en tomcat 7.0/lib antes. Después de su respuesta, creé el tomcat 7.0/lib * s * y coloqué el DLL allí, y obtuve el mismo error: Error al cargar el sqljdbc_auth.dll porque: - no sqljdbc_auth en java.library.path – Gustavo

+0

I ' he leído sobre el Tomcat Classloader antes en el enlace: http://tomcat.apache.org/tomcat-7.0-doc/class-loader-howto.html Pero parece que el Tomcat solo carga los archivos .jar , no los archivos .dll. – Gustavo

+1

Ok, para aclarar, necesitas poner el dll en la carpeta Tomcat/bin y el archivo jdbc ** JAR ** en la carpeta Tomcat/lib (perdón por mi error en los extra s de lib, que ya he corregido) –

1

Creo que está en el camino correcto.

Para el arranque de línea de comandos se puede resolver fácilmente el sin sqljdbc_auth en java.library.path problema estableciendo la variable de entorno

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

Si está ejecutando Tomcat como un servicio, cambie las opciones parámetro bajo

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

para incluir:

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

Gracias por la respuesta pero la anterior resolvió el problema. – Gustavo

0

El mismo error ocurre en Jasper Studio.

Probablemente no sea la mejor solución, pero coloque el archivo 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 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á.

Cuestiones relacionadas