6

我有一个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()随机时间...

4

2 回答 2

5

您可以使用该SHUTDOWN命令在关闭应用程序之前正确地将所有写入刷新到磁盘。

另一种解决方案是调用CHECKPOINT SYNC您的关闭挂钩(但在关闭所有连接之前)。这不会“关闭”数据库,当最后一个连接关闭时,无论如何都应该自动完成。

于 2011-12-15T10:03:10.917 回答
0

您可以使用 Executors 删除Thread.sleep(),使用其 submit 方法提交可调用实例,然后使用ExecuterServcie -awaitTermination()方法,或者您可以选择使用CountDownLatch -countDown()方法。参考CountDownLatchExecutorService

于 2017-12-18T05:08:47.530 回答