2011-08-24 17 views
6

Estoy usando Play para escribir una aplicación web que se implementa en Tomcat. Debido a que la aplicación no procesará demasiados datos, estoy usando la base de datos H2 predeterminada con Hibernate. Cuando quiero implementar una nueva versión de la aplicación, cierro tomcat, borro la vieja aplicación web y WAR, agrego mi nueva GUERRA y comienzo una copia de seguridad.¡Juego! no cerrar H2 correctamente

Esto funcionó hasta hace unos días, cuando agregué el componente de la base de datos. Ahora, a menudo no puedo volver a implementar la aplicación. Cuando elimino el directorio anterior, se regenera automáticamente con esta estructura:

$ ls -laR myapp/ 
myapp/: 
total 24 
drwxr-xr-x 3 root root 4096 Aug 24 17:20 . 
drwxr-xr-x 13 root root 4096 Aug 24 17:20 .. 
drwxr-xr-x 3 root root 4096 Aug 24 17:20 WEB-INF 

myapp/WEB-INF: 
total 24 
drwxr-xr-x 3 root root 4096 Aug 24 17:20 . 
drwxr-xr-x 3 root root 4096 Aug 24 17:20 .. 
drwxr-xr-x 3 root root 4096 Aug 24 17:20 application 

myapp/WEB-INF/application: 
total 24 
drwxr-xr-x 3 root root 4096 Aug 24 17:20 . 
drwxr-xr-x 3 root root 4096 Aug 24 17:20 .. 
drwxr-xr-x 3 root root 4096 Aug 24 17:20 db 

myapp/WEB-INF/application/db: 
total 24 
drwxr-xr-x 3 root root 4096 Aug 24 17:20 . 
drwxr-xr-x 3 root root 4096 Aug 24 17:20 .. 
drwxr-xr-x 2 root root 4096 Aug 24 17:20 h2 

myapp/WEB-INF/application/db/h2: 
total 24 
drwxr-xr-x 2 root root 4096 Aug 24 17:20 . 
drwxr-xr-x 3 root root 4096 Aug 24 17:20 .. 
-rw-r--r-- 1 root root 100 Aug 24 17:20 play.lock.db 

Lo mismo ocurre cuando el WAR se descomprime.

Recientemente me di cuenta de un mensaje en el registro catalina.out quejándose de que mi aplicación no apagaba un proceso llamado "H2 File Lock Watchdog". Basado en una búsqueda breve de los documentos H2, creo que el proceso es lo que interfiere con mi aplicación.

EDITAR

Aquí está la línea de quejas en el archivo de registro:

SEVERE: The web application [/myapp] appears to have started a thread named [H2 File Lock Watchdog /var/lib/apache-tomcat-6.0.32/webapps/myapp/WEB-INF/application/db/h2/play.lock.db] but has failed to stop it. This is very likely to create a memory leak.

Así que, ¿cómo puedo matar a este proceso? No puedo reiniciar la máquina porque no es mía, y no puedo encontrar el perro guardián con top o ps. Prefiero una forma de que Play lo cierre de forma automática, pero no estoy por encima de construirlo en mi script de implementación.

¡Gracias a un millón si ha leído hasta aquí!

+0

Otro punto que vale la pena mencionar es que el proceso de la base de datos muere evidentemente. No estoy seguro de cuánto tiempo lleva, pero está en la escala de horas.Esperarlo es solo una solución, ¿pero mejor que nada? – andronikus

Respuesta

8

I Cierre Tomcat

¿Estás seguro de que han cerrado por completo Tomcat? Porque la base de datos H2 ya se está ejecutando. Si cierra el proceso de tomcat, la base de datos también se detiene (porque H2 se está ejecutando dentro del proceso de tomcat). Excepto si ejecuta la base de datos en un proceso diferente.

¿O acabas de cerrar la aplicación web dentro de tomcat? Si ese es el caso, al menos una conexión de base de datos no se cerró, por lo que la base de datos se sigue ejecutando (y crea este archivo .lock.db).

Ahora, no conozco el marco de juego, y no puedo decir cómo asegurar que todas las conexiones a la base de datos estén cerradas.

Una forma de forzar el cierre de la base de datos es ejecutar la instrucción SQL SHUTDOWN.

no puedo encontrar el organismo de control con top o ps

top y ps sólo muestran procesos. El watchdog H2 es un thread dentro de un proceso java. Para ver el hilo, use:

jps -l (to get the list of Java processes) 
jstack -l <pid> (to get a full thread dump) 
+0

Estoy cerrando el servidor con 'sh bin/shutdown.sh' como de costumbre. ¿Hay algo más que deba hacer? ¡El juego! framework tiende a manejar cosas como esta automáticamente, así que no sé cómo pasar una declaración 'SHUTDOWN'. Trataré de matar el proceso de Java manualmente el lunes y espero no pisar los dedos de nadie. – andronikus

+0

Desafortunadamente 'jps -l' solo me muestra JPS. – andronikus

Cuestiones relacionadas