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í!
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