2011-12-15 20 views
6

Tôi có một shutdownhook, được thực hiện khi quá trình được chấm dứt. Tuy nhiên những thay đổi mà chương trình làm cho cơ sở dữ liệu h2 không liên tục. Chỉ khi tôi để cho thread shutdown chờ một thời gian sau khi commit, tôi sẽ thấy những thay đổi trong DB khi tôi đi lên một lần nữa.Chờ cho các chủ đề để viết các thay đổi trong 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"); 
    } 
} 

Chỉ với sleep, tôi sẽ thấy những thay đổi vào lần tiếp theo tôi kết nối với DB.

Có ai biết cách đợi cơ sở dữ liệu H2 kết thúc hoạt động trước khi quá trình chấm dứt không? Tôi muốn tránh số Thread.sleep() với thời gian ngẫu nhiên ...

Trả lời

5

Bạn có thể sử dụng lệnh SHUTDOWN để xóa hoàn toàn tất cả ghi vào đĩa trước khi đóng ứng dụng của mình.

Một giải pháp thay thế sẽ là gọi CHECKPOINT SYNC trong móc tắt máy của bạn (nhưng trước khi đóng tất cả các kết nối). Điều này sẽ không "đóng" cơ sở dữ liệu mà nên được thực hiện tự động anyway khi kết nối cuối cùng được đóng lại.

+0

Cảm ơn bạn, điều đó hoạt động! Tôi hoàn toàn quên mất lệnh SHUTDOWN ... – morja

0

bạn có thể xóa Thread.sleep() bằng Chấp hành viên, sử dụng phương pháp nộp để nộp một thể hiện của callable và sau đó sử dụng ExecuterServcie -awaitTermination() phương pháp hoặc bạn có một tùy chọn để sử dụng là CountDownLatch - phương thức countDown(). tham khảo CountDownLatchExecutorService