2011-12-15 2 views
6

Iプロセスが終了したときに実行されるshutdownhookがあります。しかし、プログラムがh2データベースに対して行った変更は永続的ではありません。私はシャットダウンスレッドがコミット後いくつかの時間を待たせた場合にのみ、私は再び立ち上げ時にDBの変更を見るでしょう。スレッドが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で、私はDBへの接続の変更次回が表示されます。

プロセスが終了する前にH2データベースが操作を終了するのを誰かが知っていますか?私はランダムな時間のThread.sleep()を避けたいです...

答えて

5

SHUTDOWNコマンドを使用すると、アプリケーションを閉じる前にディスクへのすべての書き込みを正しくフラッシュできます。

代わりの解決方法は、シャットダウンフックで(すべての接続を閉じる前に)CHECKPOINT SYNCを呼び出すことです。これは、最後の接続が閉じられたときに自動的に行われるべきデータベースを「閉じる」ことはありません。

+0

を参照してくださいありがとうございました!私は完全にシャットダウンコマンドを忘れていた... – morja

0

あなたが)呼び出し可能なのインスタンスを提出し、その後ExecuterServcie -awaitTerminationを(使用するようにその提出方法を使用し、エグゼキューを使用して方法をのThread.sleep()を削除することができたり、使用するオプションを持っているがたCountDownLatchです - countDown()メソッド。 CountDownLatchExecutorService

関連する問題