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 数据库,关闭时不保存更改的主要内容,如果未能解决你的问题,请参考以下文章