2011-12-15 16 views
6

İşlemi sonlandırdığınızda çalıştırılan bir kapanma işlemi var. Ancak, programın h2 veritabanına yaptığı değişiklikler kalıcı değildir. Sadece kapatma iş parçacığının işlemden sonra bir süre beklemesine izin verirsem, DB'deki değişiklikleri tekrar toparlarken göreceğim.İş parçacığı, kapatma işleminde değişiklik yapmasını bekleyin

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

sadece sleep ile, ben DB bağlanmak değişiklikler sefere göreceksiniz.

Süreç sonlandırılmadan önce H2 veritabanının işlemi bitirmesini nasıl bekleyeceğini bilen var mı? Thread.sleep()'dan rastgele bir zaman dilimi ile kaçınmak istiyorum ...

cevap

5

Uygulamanızı kapatmadan önce tüm yazımları diske düzgün şekilde akıtmak için SHUTDOWN komutunu kullanabilirsiniz.

Alternatif bir çözüm, kapanma kancanıza CHECKPOINT SYNC numaralı telefonu aramak olacaktır (ancak tüm bağlantıları kapatmadan önce). Bu, son bağlantı kapatıldığında her zaman otomatik olarak yapılması gereken veritabanını "kapatmaz".

+0

'a bakın. Teşekkürler, işe yarıyor! SHUTDOWN komutunu tamamen unuttum ... – morja

0

Eğer executors kullanarak Thread.Sleep() kaldırmak çağrılabilir bir örneğini göndermek ve daha sonra ExecuterServcie -awaitTermination() yöntemi kullanmak onun teslim yöntemini kullanın veya bir kullanma seçeneği CountDownLatch olduğunu olabilir - countDown() yöntemi. CountDownLatch ve ExecutorService

İlgili konular