Дождитесь, пока потоки запишут изменения в shutdownhook - PullRequest
6 голосов
/ 15 декабря 2011

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

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() со случайным временем ...

Ответы [ 2 ]

5 голосов
/ 15 декабря 2011

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

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

0 голосов
/ 18 декабря 2017

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

...