2011-12-15 22 views
6

Tengo un gancho de desconexión, que se ejecuta cuando finaliza el proceso. Sin embargo, los cambios que realiza el programa en la base de datos h2 no son persistentes. Solo si dejo que el hilo de apagado espere un tiempo después de la confirmación, veré los cambios en el DB cuando vuelva a intentarlo. SóloEsperar a que los hilos escriban cambios en el anzuelo

Runtime.getRuntime().addShutdownHook(new Thread() { 
    @Override 
    public void run() { 
     // H2 db add row, commit and close 
     Thread.sleep(1000); // in try/catch 
     System.out.println("Shutdown complete"); 
    } 
} 

con un sleep, voy a ver los cambios la próxima vez que conecto a la base de datos.

¿Alguien sabe cómo esperar a que la base de datos H2 termine la operación antes de que finalice el proceso? Quiero evitar un Thread.sleep() con un tiempo aleatorio ...

Respuesta

5

Puede utilizar el comando SHUTDOWN para enjuagar correctamente todas las escrituras en el disco antes de cerrar la aplicación.

Una solución alternativa sería llamar al CHECKPOINT SYNC en su gancho de desconexión (pero antes de cerrar todas las conexiones). Esto no "cerraría" la base de datos, que debería hacerse automáticamente de todos modos cuando se cierra la última conexión.

+0

¡Gracias, eso está funcionando! Me olvidé por completo del comando SHUTDOWN ... – morja

0

se puede quitar Thread.sleep() mediante el uso de los ejecutores, utilice su método someter a presentar una instancia de exigible y luego usar ExecuterServcie -awaitTermination() método o tiene una opción para usar es CountDownLatch - countDown() método. consulte CountDownLatch y ExecutorService

Cuestiones relacionadas