Esto está relacionado con este post.

Creo que estoy teniendo problemas con H2 lo que significa que no se cierre correctamente.

Sospecho que esto ya veo myDB.lock.db cuando me paro tomcat y el proceso no se detiene.

Yo uso Tomcat de la agrupación y la url a la base de datos:

url="jdbc:h2:file:/opt/myOrg/tomcat/webapps/MyApplication/db/myDatabase;SCHEMA=myschema"

De la doc cerca de H2:

Por lo general, una base de datos se cierra cuando la última conexión a es
cerrado…. De forma predeterminada, una base de datos se cierra cuando la última conexión
está cerrada. Sin embargo, si no se cierra nunca, la base de datos se cierra cuando
la máquina virtual sale normalmente, con un cierre de gancho

No puedo entender si estoy haciendo algo mal.

Debo estar forzando a la base de datos de cerca a través de un comando? Es este el significado de cierre de gancho?

¿Qué estoy haciendo mal aquí?

Nota:

No puedo encontrar en Google un ejemplo de cómo cerrar H2 correctamente (además de la declaración que se cierra automáticamente en última conexión apagado). Debo llamar SHUTDOWN a mí mismo? Es este el enfoque adecuado?

Ya veo votos para cerrar la pregunta, pero no ha habido una razón o enlace en un ejemplo de lo que estoy investigando

ACTUALIZACIÓN:

Después de Joonas Pulakka respuesta algo más de info:

De la javacore tengo uso de un kill -3 veo los hilos:

«H2 Registro Escritor MYAPPLICATION» J9VMThread:0x08DC6F00,
j9thread_t:0x08C9B790, java/lang/Hilo:0xE7206CC8, estado:CW, prio=5
3XMTHREADINFO1 (nativo IDENTIFICADOR de subproceso:0xA32, nativo
prioridad:0x5, nativo de la política:DESCONOCIDO) 3XMTHREADINFO2

(nativo de la pila rango de direcciones de:0xE5E26000, a:0xE5E67000,
tamaño:0x41000) 3XMTHREADINFO3 Java pila de llamadas:

4XESTACKTRACE en java/lang/Objeto.esperar(Native Method)

4XESTACKTRACE en
java/lang/Objeto.esperar(Objeto.java:196(Código Compilado)) 4XESTACKTRACE
en org/h2/store/WriterThread.ejecutar(WriterThread.java:102)

4XESTACKTRACE en java/lang/Hilo.de ejecución(Thread.java:736)

3XMTHREADINFO de la piscina «-8-hilo-1» J9VMThread:0x087C0200,
j9thread_t:0x0840566C, java/lang/Hilo:0xE79BFC80, estado:P, prio=5

3XMTHREADINFO1 (nativo IDENTIFICADOR de subproceso:0xE1A, nativo
prioridad:0x5, nativo de la política:DESCONOCIDO) 3XMTHREADINFO2

(nativo de la pila rango de direcciones de:0xE5F69000, a:0xE5FAA000,
tamaño:0x41000) 3XMTHREADINFO3 Java pila de llamadas:

4XESTACKTRACE en sol/misc/Inseguro.park(Native Method)

4XESTACKTRACE en
java/util/concurrente/cerraduras/LockSupport.park(LockSupport.java:184(Compilado
Código)) 4XESTACKTRACE en
java/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1998(Compilado
Código)) 4XESTACKTRACE en
java/util/concurrente/LinkedBlockingQueue.tomar(LinkedBlockingQueue.java:413(Compilado
Código)) 4XESTACKTRACE en
java/util/concurrente/ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:958(Compilado
Código)) 4XESTACKTRACE en
java/util/concurrente/ThreadPoolExecutor$Trabajador.ejecutar(ThreadPoolExecutor.java:918)
4XESTACKTRACE en java/lang/Hilo.de ejecución(Thread.java:736)

3XMTHREADINFO «H2 Archivo de Bloqueo de vigilancia
opt/myOrg/tomcat/webapps/Miaplicacion/db/mibasededatos.de bloqueo.db»
J9VMThread:0x08DC6900, j9thread_t:0x08C9BA24, ja

va/lang/Hilo:0xE71E9018, estado:CW, prio=9 3XMTHREADINFO1

(nativo IDENTIFICADOR de subproceso:0xA30, nativo de prioridad:0x9, nativo de la política:DESCONOCIDO)

3XMTHREADINFO2 (nativo de la pila rango de direcciones de:0xE5DBA000,
a:0xE5DFB000, tamaño:0x41000) 3XMTHREADINFO3 Java
pila de llamadas: 4XESTACKTRACE en
java/lang/Hilo.el sueño(Native Method) 4XESTACKTRACE

en java/lang/Hilo.el sueño(Hilo.java:851(Código Compilado))

4XESTACKTRACE en
org/h2/store/FileLock.ejecutar(FileLock.java:490) 4XESTACKTRACE

en java/lang/Hilo.de ejecución(Thread.java:736)

3XMTHREADINFO «FileWatchdog» J9VMThread:0x087C0800,
j9thread_t:0x08C9B4FC, java/lang/Hilo:0xE715D878, estado:CW, prio=5

3XMTHREADINFO1 (nativo IDENTIFICADOR de subproceso:0xA2C, nativo
prioridad:0x5, nativo de la política:DESCONOCIDO) 3XMTHREADINFO2

(nativo de la pila rango de direcciones de:0xE5E67000, a:0xE5EA8000,
tamaño:0x41000) 3XMTHREADINFO3 Java pila de llamadas:

4XESTACKTRACE en java/lang/Hilo.el sueño(Native Method)
4XESTACKTRACE en
java/lang/Hilo.el sueño(Hilo.java:851(Código Compilado)) 4XESTACKTRACE
en org/apache/log4j/helpers/FileWatchdog.ejecutar(FileWatchdog.java:104)

  • posibles duplicados de Jugar! no apagar H2 correctamente
  • hemos leído ese hilo, pero no ayuda.1) me paro tomcat y no de la solicitud. Así que no hay conexiones abiertas 2)La respuesta parece ser un trabajo cerca y estoy tratando de entender si la fuerza de shutdown a través de un comando SQL de un gancho en realidad es el enfoque recomendado.Yo no puedo decir a partir de la doc
  • H2 invoca addShutdownHook() para que, mediante una instancia de org.h2.engine.DatabaseCloser.
  • Yo no debería estar haciendo yo mismo, por ejemplo, tienen un gancho y hacer un SQL apagado?Yo no puedo encontrar un ejemplo de esto en Google o H2 docs sobre cómo H2 se supone debe ser cerrado
  • No entiendo «me paro de tomcat y el proceso no se detiene». Esto no significa de Tomcat no se cierre? En ese caso, usted debe averiguar por qué Tomcat no shutdown.
  • catalina.no es un error.Y el uso de kill -3 en el proceso de ejecución de ps -ef veo que H2 de alguna forma está activo.También veo la db.lock de H2.Así que tengo la fuerte sospecha de que esto es H2 problema y no Tomcat

InformationsquelleAutor Jim | 2012-04-02

5 Comentarios

  1. 9

    La documentación dice que H2 db conexión se cierra cuando la máquina virtual se sale de la normalidad. Y eso es lo que hace. El cierre de gancho que ya existe de forma predeterminada, usted no tiene que hacer nada. El cierre de gancho es una forma perfectamente válido de cierre de los recursos que sólo necesitan ser cerrados al dejar de fumar.

    Si usted tiene .lock.db archivos restantes después del apagado, a continuación, la máquina virtual no salir normalmente. Usted escribió que el proceso no se detiene. Usted tiene que encontrar la razón para que, porque, probablemente, eso es lo que también impide que el H2 enlace de cierre de la ejecución.

    Con grandes bases de datos, cierre podría tomar algún tiempo. Ver con el depurador (por ejemplo, VisualVM) ¿qué hilos permanecen activas después de haber invocado (Tomcat) apagado.

    Hay más posibilidad: la de que los permisos de archivos están configurados de tal modo que el H2 puede crear el bloqueo de archivos, pero no eliminar ellos. Si OS impide H2 a partir de la supresión de los archivos de bloqueo, no hay mucho H2 pudiera hacer al respecto.

    • Gracias.Yo estaba tratando de investigar por qué el proceso no se detiene (stackoverflow.com/questions/9971876/…) y acabé aquí.También en la carpeta hay rw- permiso para el usuario y r-- permiso para el grupo.Necesito x permiso para eliminar?
    • x sólo es necesaria para la ejecución, no para suprimirlos. Pero la comprobación de que el directorio no tiene sticky bit conjunto.
    • No hay ningún t en el directorio.Y tomcat con el usuario que es el propietario de los archivos.Ahora estoy atascado!
    • No, usted no está atrapado. Usted acaba de excluir la posibilidad de que sea un problema de permisos (e incluso si hubiera sido un problema de permisos, sólo se han explicado los .lock.db archivos, no se por qué el proceso no se detiene. (Si H2 no se puede borrar los archivos, entonces no se puede, pero definitivamente no bloquear para siempre, porque de eso).). Lo hilos de seguir haciendo algo cuando se invoca Tomcat apagado?
    • Tengo la actualización de OP en este.Veo también algunos hilos no la mía, pero creo que debería centrarse en la mía.Las partes que son sospechosos para mí es H2 y Log4j me di cuenta.Los otros hilos no estoy seguro
    • Las líneas con 3XMTHREADBLOCK? Por ejemplo, H2 Log Writer está a la espera de algo, pero ¿qué es exactamente? Usted tiene que centrarse en lo que sea «redes» los hilos de la forma.
    • No 3XMTHREADBLOCK de THREADBLOCK en javacore. No sé cómo encontrar el «redes».Cualquier sugerencia?
    • El at sun/misc/Unsafe.park(Native Method) 4XESTACKTRACE at java/util/concurrent/locks/LockSupport.park(LockSupport.java:184(Compiled Code)) me preocupa.Podría ser porque me estoy haciendo un shutdownNow de un ExecutorService en un shutdown gancho?
    • Yo no puedo decir cómo el código reacciona a shutdown vs shutdownNow. ¿Tratando de salir? Como para el hilo de las redes, me refiero a dependencias mutuas: si un hilo está bloqueado en un bloqueo, a la que pertenece ese bloqueo? Encuentre mirando el todo hilo de volcado. No se puede mirar en su «propio» de los hilos, ya que pueden compartir recursos con otros: se podría esperar para algunos otros hilos, o viceversa. No el hilo es de la isla.

  2. 4

    Puede ejecutar la instrucción SHUTDOWN y, a continuación, cierre la conexión.

    La SHUTDOWN comando hará que H2 libre de todos los recursos relacionados con la conexión inmediatamente. Que, por ejemplo, permitir a deshacerse de una base de datos H2 embebida cuando puede volver a implementar una aplicación web.

  3. 4

    Mirando el DbStarter.contextDestroyed()‘s código (gracias a Allan5‘s respuesta), aquí está el código que va a trabajar:

    connection.createStatement().execute("SHUTDOWN");

    Así Aarón Digulla‘s respuesta era correcta (aunque no totalmente «copiar/pastable»).

    Por otra parte, si usted ha comenzado un H2 TCP servidor mediante server = Server.createTcpServer("-tcpAllowOthers"), puedes hacerlo simplemente con server.stop().

  4. 1

    No, un cierre de gancho es simplemente un hilo que se ejecuta cuando la JVM termina, no importa si al regresar de main(), Sistema de llamadas.exit(int) o lanzar una excepción. Sólo una JVM accidente podría evitarlo. Ver En Tiempo De Ejecución.addShutdownHook(Hilo).

    • Yo sé lo que es un cierre de gancho.No sé si este es el camino correcto para cerrar H2
    • Si usted sabe lo que es un cierre de gancho es, ¿por qué preguntar «es este el significado de cierre de gancho?«
    • significado en el contexto de desvíos hacia abajo H2.No puedo encontrar un ejemplo en mostrar que debo agregar un gancho de mí mismo
    • ¿Qué puedo obtener de esta documentación es que el cierre de gancho es proporcionado por el marco y usted no tiene que agregar.
  5. 1

    No estoy seguro si esto es relevante para su situación, pero ¿has intentado añadir un DBStarter oyente?

    http://www.h2database.com/html/tutorial.html, consulte «Uso de un Oyente de Servlet para Iniciar y Detener una Base de datos» de la sección.

    El enlace sugiere agregar el siguiente web.xml:

    <listener>
        <listener-class>org.h2.server.web.DbStarter</listener-class>
    </listener>

    Por favor vea la discusión aquí (es cierto que desde 2008, por lo que puede estar fuera de fecha) – al parecer, la corrección se aplica a ambos integrados y no incrustados instancias: http://groups.google.com/group/h2-database/browse_thread/thread/eb609d58c96f4317

    Alternativamente, ¿cómo está usted usando las conexiones? Está usted seguro de que son la limpieza de las conexiones correctamente?

    Estaba teniendo problemas de antes, en mi caso yo estaba usando la conexión con un JPA EntityManager y se me olvidó cerrar la instancia de EntityManager después de su uso, lo que resultó en algunas cuestiones:

    @PersistenceUnit(unitName="myEm")
    private EntityManagerFactory emf;
    
    public void doStuff() {
        EntityManager em = emf.createEntityManager();
        ...
        em.close(); //forgot this line
    }

Dejar respuesta

Please enter your comment!
Please enter your name here