我使用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)
{}
}
});
这适用于我的机器,但不适用于另一台相当迟缓的机器。
答案 0 :(得分:0)
首先,您的方法可能是错误的。当一段与DB相关的代码成功执行时,应该提交事务。在关机钩子中做一个commit
就像是在说“嘿,我不在乎房子是否烧毁,让我们去客厅玩。”
也就是说,commit
可能没有效果,因为大多数框架都会回滚任何失败的事务。但是这些效果取决于设计的其他部分,例如Spring框架和Transactional
注释,以便正常工作。如果您没有使用Spring,那么您可能应该这样做。
所以你应该做的是在“事务括号”中包装每个“数据库更改”(即用户可以通过UI调用的每个命令):当用户发送命令并提交时打开事务在将结果返回到UI之前。