2011-12-15 6 views
6

У меня есть shutdownhook, который выполняется, когда процесс завершается. Однако изменения, внесенные программой в базу данных h2, не являются постоянными. Только если я позволю потоку выключения ждать некоторое время после фиксации, я увижу изменения в БД, когда я снова улажусь.Подождите, пока потоки будут записывать изменения в shutdownhook

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"); 
    } 
} 

Только с sleep, я буду видеть изменения в следующий раз, когда я подключиться к БД.

Кто-нибудь знает, как дождаться, когда база данных H2 завершит операцию до завершения процесса? Я хочу избежать Thread.sleep() со случайным временем ...

ответ

5

Вы можете использовать команду SHUTDOWN, чтобы должным образом удалить все записи на диск перед закрытием приложения.

Альтернативным решением было бы позвонить CHECKPOINT SYNC в ваш крюк выключения (но до закрытия всех соединений). Это не «закрыло» базу данных, которая должна выполняться автоматически в любом случае, когда последнее соединение будет закрыто.

+0

спасибо, thats working! Я полностью забыл о команде SHUTDOWN ... – morja

0

вы можете удалить Thread.sleep() с помощью Executors, использовать его метод представить представить экземпляр отозваны, а затем использовать ExecuterServcie -awaitTermination() метод или у вас есть возможность использовать это CountDownLatch - счетDown() способ. см. CountDownLatch и ExecutorService

Смежные вопросы