H2 数据库,关闭时不保存更改

Posted

技术标签:

【中文标题】H2 数据库,关闭时不保存更改【英文标题】:H2 database , does not save changes on shutdown 【发布时间】:2014-07-28 11:58:25 【问题描述】:

我使用 H2 和 Hibernate 4.1 ORM 作为 JPA 2。

这是我的来自 persistence.xml 的数据库 URL。

<property name="javax.persistence.jdbc.url" value="jdbc:h2:./database/data;DB_CLOSE_ON_EXIT=FALSE;TRACE_LEVEL_FILE=3"/>

我将数据库设置为不自动关闭,因为我使用了一个关闭挂钩,它提交了一个事务。而且我还设置系统将所有 SQL 记录到跟踪文件中。我可以在文件中看到数据库接收到所有 SQL 命令。

我的钩子

Runtime.getRuntime().addShutdownHook(new Thread() 
    
        @Override
        public void run() 
        
            if(main!=null)
            
                main.Disconnect();
            
            try
            
                PersistenceHandler.em.getTransaction().commit();
                PersistenceHandler.em.createQuery("SHUTDOWN COMPACT").executeUpdate();
                PersistenceHandler.em.close();
            catch(Exception e)e.printStackTrace();
            try
            
               Config.Write();
            
            catch(Exception e)
            
        
    );

这在我的机器上工作,但在另一台相当缓慢的机器上工作。

【问题讨论】:

你是如何关闭 JVM 的? System.exit(0) 那样 【参考方案1】:

首先,您的方法可能是错误的。当一段与 DB 相关的代码成功执行时,应提交事务。在关机钩子中执行commit 就像在说“嘿,我不在乎房子是否被烧毁了,我们去客厅玩吧。”

也就是说,commit 可能没有任何效果,因为大多数框架都会回滚任何失败的事务。但是这些效果取决于您设计的其他部分,例如 Spring 框架和 Transactional 注释才能正常工作。如果您不使用 Spring,那么您可能应该使用。

因此,您真正应该做的是将每个“数据库更改”(即用户可以通过 UI 调用的每个命令)包装在“事务括号”中:当用户发送命令并提交时打开事务在将结果返回给 UI 之前。

【讨论】:

我认为,数据更改不是基于 UI,而是基于 API 接收的数据,每个持久对象每秒最多可更改 7 次。问题不在于事务失败,而在于数据库更改仍然是内存而不是写入磁盘驱动器。 所以每次通过API接收数据都需要创建一个事务,并在变化好的时候提交。

以上是关于H2 数据库,关闭时不保存更改的主要内容,如果未能解决你的问题,请参考以下文章

C# dotnet 使用 OpenXml 关闭时不自动保存文档方法

管理 H2 数据库的前端工具 [关闭]

sqlserver设计视图修改表时不允许保存更改的问题处理

sqlserver设计视图修改表时不允许保存更改的问题处理

保存的首选项在重新启动时不起作用

数据库表设计时不允许保存的解决方法