2011-04-09 9 views
6

Mi servidor Tomcat 5 se ejecuta en centos frecuencia (varias veces/día) produce el siguiente error: libTomcat 6.0.24 Excepción: No puede mostrarse com.mysql.jdbc.SQLError

Apr 7, 2011 11:02:30 PM org.apache.catalina.loader.WebappClassLoader loadClass 
INFO: Illegal access: this web application instance has been stopped already. Could not load com.mysql.jdbc.SQLError. The eventual following stack trace is caused by an error thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access, and has no functional impact. 
java.lang.IllegalStateException 
     at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1370) 
     at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1329) 
     at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3291) 
     at com.mysql.jdbc.MysqlIO.quit(MysqlIO.java:1665) 
     at com.mysql.jdbc.ConnectionImpl.realClose(ConnectionImpl.java:4411) 
     at com.mysql.jdbc.ConnectionImpl.cleanup(ConnectionImpl.java:1315) 
     at com.mysql.jdbc.ConnectionImpl.finalize(ConnectionImpl.java:2761) 
     at java.lang.ref.Finalizer.invokeFinalizeMethod(Native Method) 
     at java.lang.ref.Finalizer.runFinalizer(Unknown Source) 
     at java.lang.ref.Finalizer.access$100(Unknown Source) 
     at java.lang.ref.Finalizer$FinalizerThread.run(Unknown Source) 

de Tomcat contiene MySQL -connector-java-5.1.8-bin.jar y mysql-connector-java-5.1.6-bin.jar, mientras que el directorio WEB-INF/lib solo contiene mysql-connector-java-5.1.8-bin.jar . Los tres archivos jar contienen la clase SQLError.

Quisiera eliminar esta excepción. ¿Podría Tomcat buscar otro lugar para tratar de encontrar esta clase?

+2

No guarde la misma versión diferente de lib en la carpeta lib. Intenta mantener la última y elimina otras y prueba. – Senthil

+0

He actualizado según lo sugerido a la última versión (5.1.15) del conector mysql según lo sugerido y quité todas las copias más viejas. Estoy usando tomcat 6.0.24 en lugar de 5. Disculpa por el error tipográfico. – user1621123

Respuesta

4

El error no es que la clase no pueda ser encontrada. No se puede cargar porque la aplicación web se ha detenido. Sospecho que esto podría estar sucediendo después de que se reinicie la aplicación web, donde está inactiva durante un corto período de tiempo. Entonces, algún método finalize() en el código probablemente intente hacer algo de limpieza demasiado tarde. No sé si eso está en tu código o en el controlador de MySQL. Definitivamente, solo debería tener una versión de un jar en un directorio a la vez. Es posible que desee actualizarlo al latest (5.1.15 en este momento) en caso de que se haya solucionado algo que pueda afectarlo.

1

Las versiones más nuevas de Tomcat requieren que coloque los JAR del controlador JDBC en el directorio Tomcat/lib, no en su WEB-INF. Y solo debería haber una versión en ese directorio, la versión que desea usar, y ninguna otra.

Dado que está utilizando Tomcat 5, le recomiendo que coloque el JAR en su directorio server/lib.

No sé si esta es la causa de su problema, pero vale la pena intentarlo.

+2

Er realmente? ¿Enlazar? – MJB

0

Puede verificar el orden de los directorios en el classpath. Una vez tuve dos versiones de un archivo jar: una en el directorio de trabajo y otra en el directorio de extensiones de Java. El orden de la ruta de clase fue: primero, revise el directorio de extensiones de eclipse, luego el directorio de trabajo en segundo lugar. Una vez que encontró una versión del jar en el directorio de extensiones, no siguió buscando la que estaba especificando en el directorio de trabajo. El orden importa en el classpath.

0

¿Dónde se configura su grupo de conexiones JDBC? ¿Está en el JNDI de Tomcat (conf/server.xml) o directamente en su aplicación? ¿Alguna de tus aplicaciones web se ha desplegado/redesplegado cuando aparece ese mensaje?

A partir del código fuente de StackTrace y MysqlIO.java y WebappClassLoader.java yo supongo que:

  • una de las aplicaciones web se Undeployed - Basado en el código en WebappClassLoader:

    // Acceso de registro al cargador de clases detenido

    if (! Started) { try { throw new IllegalStateException(); } catch (IllegalStateException e) { log.info (sm.getString ("webappClassLoader.stopped", nombre), e); }}

  • sus conexiones JDBC no se limpian correctamente durante el cierre aplicación web (su ServletContextListener.contextDestroyed debería hacer eso, o por ejemplo,parámetro de frijol destruir-El método de la primavera)

  • algunas de las clases que son utilizados por código del controlador MySQL consiguió descargada por GC
  • esas conexiones son GC elegible cuando sus paradas de aplicación, pero GC encuentra que la conexión MySQL finalizar método es anulado por lo que lo ejecuta
  • cuando se ejecuta ese método de finalización requiere una clase que debe cargarse. El cargador de clases de Tomcat de su aplicación web detenida lo detecta e informa que no debe haber otras clases cargadas por una aplicación web detenida.

Mi solución a su problema sería comprobar cómo se limpia el conjunto de conexiones JDBC durante el cierre de la aplicación web y asegúrese de que el grupo también se cierre explícitamente.

0

Lo más probable es que esté utilizando la agrupación de conexiones en su aplicación que comprueba la conectividad de la base de datos.

2

Utilice solo una versión del archivo jar en el directorio WEB-INF/lib. Mejor utilizar la última versión de mysql-connector-java 5.1.26.

0

Aparte de utilizar sólo una versión de la jarra (que los otros usuarios han sugerido), por favor, compruebe lo siguiente, así:

  1. Asegúrese de que cuando Ha terminado con la conexión de la base de datos, , cierre la conexión con close() llame.
  2. Errores como este pueden ocurrir cuando abre número de conexiones y no las cierra explícitamente.
  3. En estas situaciones, muchas veces, la base de datos cierra realmente las conexiones inactivas, pero el objeto que representa esa conexión en el lado de la aplicación todavía no está cerrado.
  4. Lo que ocurre es que estos objetos de conexión abierta están al acecho y cuando finaliza el finalizador (evidente desde la pila) e intenta cerrar la conexión, obtiene IllegalStateException ya que este objeto de conexión no está asociado con ninguna conexión de base de datos.
Cuestiones relacionadas