Foros del Web » Programación para mayores de 30 ;) » Java »

TOMCAT funciona cuando quiere

Estas en el tema de TOMCAT funciona cuando quiere en el foro de Java en Foros del Web. Amigos del Foro, ojalá puedan ayudarme. He buscado mucho cómo resolver esto, sin embargo, nada me ha resultado. Estoy desarrollando una aplicación web con Java, ...
  #1 (permalink)  
Antiguo 23/11/2008, 16:19
Avatar de congonga  
Fecha de Ingreso: febrero-2008
Ubicación: Concepción
Mensajes: 29
Antigüedad: 16 años, 2 meses
Puntos: 0
Exclamación TOMCAT funciona cuando quiere

Amigos del Foro, ojalá puedan ayudarme. He buscado mucho cómo resolver esto, sin embargo, nada me ha resultado.

Estoy desarrollando una aplicación web con Java, un Servlet y algunos JSP, en Tomcat 6.0.14, usando Ubuntu Gutsy. He desarrollado una clase que se conecta con DB2, la cual he probado infinidad de veces, con una clase de prueba, por consola. La clase de conexion funciona correctamente.

EL PROBLEMA:
A pesar de que siempre arranca bien, carga todos los ejemplos que trae de jsp y servlet correctamente, TOMCAT FUNCIONA CUANDO QUIERE,
1) Cargando o no mi servlet,
2) Perdiendo o no conexiones a DB2, y
3) Haciendo nulos o no, valores en las http-sesions. Sin haber hecho ningun cambio en los códigos fuente, Tomcat a veces funciona y a veces no.

LAS SOLUCIONES QUE PROBÉ:
- Ya probé agregando al arrancar el parametro -Xmx pero no veo diferencias. Igualmente Tomcat sigue inestable.
- Ya probé creando la carpeta CATALINAHOME/common/lib (la versión 6 no la trae) y copiando ahí los jar necesarios. Sigo igual que antes.
- Ya probé editando el setclaspath.sh, dado que en las primeras líneas, lo que hace es literalmente, borrar todo el CLASSPATH que haya... pues bien, había un CLASSPATH = "" y lo cambié por un CLASSPATH = $CLASSPATH, para que no me borrara lo que hay, y trabajar sobre esta variable.
- Ya probé arrancando java como server con el parametro -server.

¿Qué otra cosa puedo probar? Acepto cualquier sugerencia (relacionada con mi inquietud, por supuesto).

DETALLES
¿Qué estoy usando?
JAVA VERSION: $java -version
Java(TM) SE Runtime Environment (build 1.6.0_02-b05)
Java HotSpot(TM) Client VM (build 1.6.0_02-b05, mixed mode)


JAVAC VERSION: $javac -version
javac 1.6.0_02

Al arrancar TOMCAT: $sudo /opt/apache-tomcat-6.0.14/bin/./startup.sh
Using CATALINA_BASE: /opt/apache-tomcat-6.0.14
Using CATALINA_HOME: /opt/apache-tomcat-6.0.14
Using CATALINA_TMPDIR: /opt/apache-tomcat-6.0.14/temp
Using JRE_HOME: /opt/java/jdk/jre


Por el contrario, para mi pesar, es Tomcat quien me ha estado causando problemas. Desarrollé un servlet simple, que gestiona el login de los usuarios, y que utiliza la clase de conexion como un java bean a lo largo de la HttpSession. También me funciona. Lo que no me ha podido funcionar bien es que Tomcat suele "caerse", provocando tres situaciones problema:
-----------
1) Tomcat, sin la menor advertencia, haciendo que algunos de los atributos de la sesión tomen valores nulos, o haciendo que las conexiones con db2 se pierdan. Sin embargo, al presionar f5 y recargar el jsp, cualquiera de ellos, todo suele volver a la normalidad, y otras veces, no. Se quedan ahí, como valores nulos. La salida de la excepción para este caso es la siguiente:

Código:
org.apache.jasper.JasperException: java.lang.NullPointerException
    org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:541)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:435)

    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

causa raíz

java.lang.NullPointerException
    org.apache.jsp.query_002dadd_002d2_jsp._jspService(query_002dadd_002d2_jsp.java:107)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)

    javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:393)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)

    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
------------
2) En ocasiones, al arrancar Tomcat, no me carga el servlet (ojo, que no he hecho ningun cambio, es un problema de Tomcat). A veces carga, a veces no, mostrando la siguiente excepción:

javax.servlet.ServletException: Error reservando espacio para una instancia de servlet
org.apache.catalina.valves.ErrorReportValve.invoke (ErrorReportValve.java:102)
org.apache.catalina.connector.CoyoteAdapter.servic e(CoyoteAdapter.java:263)

org.apache.coyote.http11.Http11Processor.process(H ttp11Processor.java:844)
org.apache.coyote.http11.Http11Protocol$Http11Conn ectionHandler.process(Http11Protocol.java:584)
org.apache.tomcat.util.net.JIoEndpoint$Worker.run( JIoEndpoint.java:447)

java.lang.Thread.run(Thread.java:619)

causa raíz

Código:
java.lang.NoClassDefFoundError: javax/servlet/http/HttpServlet
    java.lang.ClassLoader.defineClass1(Native Method)
    java.lang.ClassLoader.defineClass(ClassLoader.java:620)

    java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
    java.net.URLClassLoader.defineClass(URLClassLoader.java:260)
    java.net.URLClassLoader.access$000(URLClassLoader.java:56)
    java.net.URLClassLoader$1.run(URLClassLoader.java:195)

    java.security.AccessController.doPrivileged(Native Method)
    java.net.URLClassLoader.findClass(URLClassLoader.java:188)
    java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:276)

    java.lang.ClassLoader.loadClass(ClassLoader.java:251)
    org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1273)
    org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1204)

    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:263)
    org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)

    org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:584)
    org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
    java.lang.Thread.run(Thread.java:619)
-----------
3) La tercera situación problema, yo creo que se debe al mal funcionamiento descrito en 1) y 2), y sucede que las conexiones que hago con DB2 se pierden, arrojando diversos valores de SQLCODE, SQLSTATE y SQLERROR, según sea la página jsp que esté fallando.

Agradería cualquier sugerencia o comentario.

Última edición por congonga; 23/11/2008 a las 23:21
  #2 (permalink)  
Antiguo 24/11/2008, 07:44
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Respuesta: TOMCAT funciona cuando quiere

Cita:
Iniciado por congonga Ver Mensaje
1) Tomcat, sin la menor advertencia, haciendo que algunos de los atributos de la sesión tomen valores nulos, o haciendo que las conexiones con db2 se pierdan. Sin embargo, al presionar f5 y recargar el jsp, cualquiera de ellos, todo suele volver a la normalidad, y otras veces, no. Se quedan ahí, como valores nulos. La salida de la excepción para este caso es la siguiente:
Esto suena a que la sesion caduca, y cuando eso ocurre se vacian los atributos que hay dentro, por eso al recuperarlos devuelven null, ya que realmente no están dentro de la sesión, que es nueva. La NPE es debida seguramente a que tu código no trata adecudamente esta circunstancia e intenta usar directamente un atributo recuperado de la sesion, que resulta ser null.

Cita:
Iniciado por congonga Ver Mensaje
2) En ocasiones, al arrancar Tomcat, no me carga el servlet (ojo, que no he hecho ningun cambio, es un problema de Tomcat). A veces carga, a veces no, mostrando la siguiente excepción:

javax.servlet.ServletException: Error reservando espacio para una instancia de servlet
Ese error(java.lang.NoClassDefFoundError: javax/servlet/http/HttpServlet) suena a que tienes las clases del API de servlet repetidas en el classpath, seguramente por tener alguna copia en alguna aplicación. Eso puede darte errores poco predecibles y extraños como este. La primera parte parecería indicar problemas de "memoria/espacio" pero el mensaje raiz indica problemas de classpath, y además sería bastante raro que te lo diera al arrancar el servlet. A no ser que el servidor fuera muy muy muy justo de memoria por otras aplicaciones que arrancan antes, apostaría por el classpath.

Cita:
Iniciado por congonga Ver Mensaje
3) La tercera situación problema, yo creo que se debe al mal funcionamiento descrito en 1) y 2), y sucede que las conexiones que hago con DB2 se pierden, arrojando diversos valores de SQLCODE, SQLSTATE y SQLERROR, según sea la página jsp que esté fallando.
Que las sesiones se vacien como mucho deberia darte problemas de crear demasiadas conexiones, si no las cierras bien al caducar las sesiones y las re-creas al crear una nueva sesion. Aparte de eso, hay servidores que cortan las conexiones JDBC que están inactivas demasiado tiempo, y por eso muchos pools de conexiones las comprueban antes de devolverlas/usarlas.

De todas formas, dado que Tomcat es un software bastante popular, es bastante improbable que por defecto funcione de esa forma, así que es más probable que sea cuestión de la aplicación. Aun así y para descartar posibles problemas con el Tomcat, que haberlos haylos, lo más seguro es probar con alguna versión diferente más madura y aun mejor, probar con otro contenedor de servlets diferente.

Suerte
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #3 (permalink)  
Antiguo 24/11/2008, 13:02
Avatar de congonga  
Fecha de Ingreso: febrero-2008
Ubicación: Concepción
Mensajes: 29
Antigüedad: 16 años, 2 meses
Puntos: 0
Respuesta: TOMCAT funciona cuando quiere

Le escribí a la lista de usuarios de Tomcat y me han dado varias ideas.

Ya me cambié a la versión de Tomcat 6.0.18, pero el problema de los valores nulos en la sesión me sigue fallando, con las conexiones DB2. Una de las dudas más graves que tengo es: ¿dónde debo poner el driver JDBC de DB2 para que esté disponible para todas las aplicaciones java que desarrollo? Si bien es cierto, si lo ubico en los directorios de Tomcat me será útil, pero sólo para las aplicaciones en webapps.

Lo otro que quiero hacer para solucionar esto es usar el mencionado "pool de conexiones". Sólo he leído en teoría de qué se trata, y si alguien me puede ayudar a implementarlo para DB2 y que sean usados por los jsp que necesito, se los agradecería mucho.
  #4 (permalink)  
Antiguo 24/11/2008, 13:26
Avatar de congonga  
Fecha de Ingreso: febrero-2008
Ubicación: Concepción
Mensajes: 29
Antigüedad: 16 años, 2 meses
Puntos: 0
Pregunta Respuesta: TOMCAT funciona cuando quiere

Como ya mencioné en mi post anterior, ya me cambié de versión de Tomcat, y esta vez no he modificado ningún archivo de configuración.

Cita:
Iniciado por GreenEyed Ver Mensaje
Esto suena a que la sesion caduca, y cuando eso ocurre se vacian los atributos que hay dentro, por eso al recuperarlos devuelven null, ya que realmente no están dentro de la sesión, que es nueva. La NPE es debida seguramente a que tu código no trata adecudamente esta circunstancia e intenta usar directamente un atributo recuperado de la sesion, que resulta ser null.
En cada uno de mis jsp, chequeo que la session se haya iniciado con este código. ¿Sugieren algo diferente para que esto de los nulos no ocurra?

Código:
if (request.getSession(false)==null) { %> <jsp:forward page="index.html"/> <% }  
else{
//sentencias
}
Con respecto a la api de Servlets, me has sembrado la duda: acabo de hacer $locate servlet-api.jar Solamente me arroja que este archivo está ubicado en /usr/share/java/servlet-api.jar a pesar de que en el Tomcat nuevo que acabo recién de instalar, aparece este mismo archivo en la ruta CATALINA_HOME/lib/servlet-api.jar. Si está presente en dos lugares ¿por qué locate sólo me arroja uno? ¿Dónde debería estar el archivo para que Tomcat funcione correctamente?

Cita:
Iniciado por GreenEyed Ver Mensaje
Que las sesiones se vacien como mucho deberia darte problemas de crear demasiadas conexiones, si no las cierras bien al caducar las sesiones y las re-creas al crear una nueva sesion. Aparte de eso, hay servidores que cortan las conexiones JDBC que están inactivas demasiado tiempo, y por eso muchos pools de conexiones las comprueban antes de devolverlas/usarlas...
¿Cómo puedo gestionar que las sesiones inactivas se cierren, al igual que las conexiones que queden dando vueltas? Por otro lado, ¿cómo puedo hacer que las conexiones no se hagan null?

Gracias por la respuesta, GreenEyed y ojalá me puedan ayudar (seguir ayudando)


Congonga
  #5 (permalink)  
Antiguo 25/11/2008, 01:44
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Respuesta: TOMCAT funciona cuando quiere

Cita:
En cada uno de mis jsp, chequeo que la session se haya iniciado con este código. ¿Sugieren algo diferente para que esto de los nulos no ocurra?
Ese código sólo comprueba que la sesión no sea null, que sea distinta de null no quiere decir que la sesión que tengas no sea nueva y todos los atributos estén vacíos. Si la sesión caduca y Tomcat te crea una sesión nueva, la condición se cumple pero todos los getAttribute devolverán null.

Cita:
Con respecto a la api de Servlets, me has sembrado la duda: acabo de hacer $locate servlet-api.jar Solamente me arroja que este archivo está ubicado en /usr/share/java/servlet-api.jar a pesar de que en el Tomcat nuevo que acabo recién de instalar, aparece este mismo archivo en la ruta CATALINA_HOME/lib/servlet-api.jar. Si está presente en dos lugares ¿por qué locate sólo me arroja uno? ¿Dónde debería estar el archivo para que Tomcat funcione correctamente?
No se que hace el locate, asi que no te puedo decir por que sólo te lo encuentra en uno. Pero el servlet-api sólo debería estar en CATALINA_HOME/lib/ (si usaras otro contenedor web sería otro sitio, pero sólo debe tener una copia en el classpath el contenedor de servlets).

En cuanto a las sesiones, caducan sólas por tiempo de inactividad y lo que hay que controlar es que cuando caduquen, si tienen algun recurso dentro que deba ser "limpiado", como una conexion a BDD que haya que cerrar, pues se limpie adecuadamente. Para evitar que las conexiones a BDD se cierren por inactividad, deberias consultar la documentacion del dirver JDBC y del servidor de BDD, ya que es una cosa que depende del fabricante y no hay estandar en ese sentido.
S!
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #6 (permalink)  
Antiguo 22/10/2009, 08:10
 
Fecha de Ingreso: abril-2009
Ubicación: Caracas
Mensajes: 4
Antigüedad: 15 años
Puntos: 0
Caso Similar: Inconsistencia Tomcat Mysql Java

Saludos a la comunidad
De igual forma, he presentado el mismo problema de conexiones con tomcat 6.0.20, con un período de 3 días el servicio de tomcat pareciera perder las referencia de conexión al pool de base de datos de Mysql, al reiniciar el servicio de apache tomcat, todo vuelve a la normalidad. Ya hemos probado cambiando el context.xml al meta info de la aplicación, lo hemos configurado de igual modo en el servidor, hemos puesto el autoreconnect en false, en fin hemos modificado diversos parámetros y aun así sigue fallando la aplicación, siendo la única solución que hemos hallado, reiniciar el servicio.

Detalles de la Aplicación
JDk 1.6.0.13
Apache Tomcat 6.0.20
Conector jdbc 5.1.8
Mysql Server 5
Sistema Operativo GNU/Linux, CentOS
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:50.