Изчакайте нишките да запишат промените в shutdownhook

Имам shutdownhook, който се изпълнява, когато процесът бъде прекратен. Въпреки това промените, които програмата прави в базата данни h2, не са постоянни. Само ако оставя нишката за изключване да изчака известно време след комита, ще видя промените в DB, ​​когато започна отново.

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 ще видя промените следващия път, когато се свържа с DB.

Някой знае ли как да изчака H2 базата данни да завърши операцията, преди процесът да приключи? Искам да избегна Thread.sleep() със случайно време...


person morja    schedule 15.12.2011    source източник


Отговори (2)


Можете да използвате командата SHUTDOWN, за да изчистите правилно всички записи на диска, преди да затворите приложението си.

Алтернативно решение би било да извикате CHECKPOINT SYNC във вашата кука за изключване (но преди да затворите всички връзки). Това няма да "затвори" базата данни, което така или иначе трябва да се направи автоматично, когато последната връзка бъде затворена.

person a_horse_with_no_name    schedule 15.12.2011

можете да премахнете Thread.sleep() с помощта на Executors, да използвате неговия метод за изпращане, за да изпратите екземпляр на callable и след това да използвате метода ExecuterServcie -awaitTermination() или имате опция за използване е методът CountDownLatch -countDown(). вижте CountDownLatch и ExecutorService

person yug    schedule 18.12.2017