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

时间:2014-07-28 11:58:25

标签: java h2

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

这是来自persistance.xml的数据库网址。

<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)
            {}
        }
    });

这适用于我的机器,但不适用于另一台相当迟缓的机器。

1 个答案:

答案 0 :(得分:0)

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

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

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