【问题标题】:HSQLDB and Hibernate/JPA - not persisting to disk?HSQLDB 和 Hibernate/JPA - 不持久化到磁盘?
【发布时间】:2011-04-02 21:25:47
【问题描述】:

HSQL 和 Hibernate 的新手...

em.getTransaction().begin();
for (Activity theActivity : activities) {
  em.persist(theActivity);
}
em.getTransaction().commit();
em.close();

接着……

EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
System.out.println("QUERY:: "
    + em.createQuery("SELECT COUNT(*) FROM " + Activity.class.getName()).getSingleResult()
        .toString());
em.getTransaction().commit();

打印 25000(活动中 Activity 对象的数量)。但是当我再次运行这个测试时,count(*) 中的对象数量并没有增加(并且在程序开始时为 0)。所以对象没有被持久写入。

这是我的 hsqldb 连接字符串:

name="hibernate.connection.url" value="jdbc:hsqldb:file:data/cmon"

所以据我所知,它不是内存数据库...

有没有人知道为什么对象在单个 JVM 会话之外没有被持久化?很高兴提供更多信息,但是与 Hibernate / JPA / HSQL 相关的状态太多了,不清楚到底什么是相关的。

【问题讨论】:

  • 作为另一个数据点,最后一次运行的INSERT在data/cmon.log中,在启动时被擦除并被替换。也许有一个选项可以在启动时强制重播日志?
  • 这意味着记录确实发生了。请报告 .log 和该目录中任何 .script 文件的大小。还有你正在使用的 HSQLDB 版本。
  • @fredt - 休眠 1.8.0。日志的大小约为 4MB,大约 37000 条插入语句。 cmon.script 是 1.9K,奇怪的是以 SET WRITE_DELAY 10 结尾——这使得我对连接字符串的更改看起来不起作用。
  • HSQLDB 1.8.0 不支持连接属性。最新的 Hibernate 3.5.5 (2010.08.18) 版本支持 HSQLDB 2.0.x。从hsqldb.org/support 获取最新的 HSQLDB 2.0.1 快照 jar 并使用 jdbc:hsqldb:file:data/cmon;hsqldb.write_delay=true;shutdown=true
  • @HenryR:你有没有让它工作?我现在正在遇到一模一样的问题。日志被写入,但没有数据。

标签: java hibernate jpa hsqldb


【解决方案1】:

您是否在persistence.xml 中将hibernate.hbm2ddl.auto 设置为create-drop?这会删除您的表并在每次启动时重新创建它们。

您可以改为将其设置为update,或者如果您想自己管理架构,则将其设置为validate

【讨论】:

  • 谢谢 - 它设置为“更新”,所以我不确定这是否是问题:(
【解决方案2】:

有没有人知道为什么对象在单个 JVM 会话之外没有被持久化?

HSQLDB 不会在提交后立即将更改写入磁盘(请参阅“WRITE DELAY”),默认情况下 HSQLDB 不是 Durable(这是“性能”的来源)。

尝试在连接字符串中设置连接属性shutdown=true,以获取在最后一个连接结束时写入的更改。

jdbc:hsqldb:file:data/cmon;shutdown=true

如果没有帮助,请尝试将 WRITE DELAY 设置为 0(或 false)。如果您使用的是 HSQLDB 1.8.x,请使用 SQL 命令:

SET WRITE_DELAY 0

如果您使用的是 HSQLDB 2.0.x,您现在还可以使用连接propertyhsqldb.write_delay

jdbc:hsqldb:file:data/cmon;hsqldb.write_delay=false

【讨论】:

  • 谢谢,我会试试的。所以提交事务并不能保证持久性,看起来 - 这有点违反直觉。
  • @HenryR:就是这样,HSQLDB 默认情况下不是 Durable。 (实际上,HSQLDB 不是 A(C)ID)。
  • @Pascal Thivent - 谢谢,不幸的是,这似乎没有奏效。我的连接字符串是 jdbc:hsqldb:file:data/cmon;hsqldb.write_delay=0;shutdown=true 并且仍然没有持久性(hbm2ddl.auto 仍然设置为“更新”)
  • @HenryR:我添加了一个类似问题的链接(我写答案时找不到该问题)。我相信这是同一个“问题”。明天将对此进行测试。
  • 匿名用户的无效编辑:最终在应用程序退出之前关闭 EntityManagerFactory (emf.close()) 也会将更改刷新到磁盘:EntityManagerFactory emf; //设置emf //持久化一些实体 emf.close();
【解决方案3】:

解决办法是:

<property name="dialect">org.hibernate.dialect.HSQLDialect</property>

在 hibernate.cfg.xml 中


这是我的其余配置:

库:

  • HsqlDb 2.0.0
  • 休眠 3.5.6

网址:

<property name="connection.url">jdbc:hsqldb:file:data/mydb;shutdown=true;hsqldb.write_delay=false;</property>

【讨论】:

  • 你成就了我的一天,这个问题花了我几个小时。 +1,谢谢:)
  • 在我使用 HSQL DB 2.2.4 时为我工作。非常非常感谢!
【解决方案4】:

提交后,只需在文件模式下使用 HSQL 关闭您的 EntityManagerFactory 即可真正持久化数据...

【讨论】:

    【解决方案5】:

    我使用的是 HSQL DB 版本 2.2.5。 我尝试了上述方法,即设置 shutdown=true 和 hsqldb.write_delay=false 它不起作用。正如一些博客中所建议的,我添加了声明

    org.hsqldb.DatabaseManager.closeDatabases(0);
    

    事务提交后。但它不起作用。

    HSQL DB 版本 2.2.9 似乎比这更好。通过一种解决方法,它可以解决此问题。要处理上述问题,请采取以下步骤:-

    1) 来自 HSQL DB 版本 2.2.9 的库中的 hsqldb.jar

    2) 在 hibernate config xml 中只需指定 URL 我正在使用基于 HSQL 文件的数据库。

     <property name="hibernate.connection.url">jdbc:hsqldb:file:D:\JavaProj\TmpDBLocation\myKauDB</property>
    

    3) 在你的程序最后写语句

    org.hsqldb.DatabaseManager.closeDatabases(0);
    

    现在运行将数据提交到数据库的休眠程序。

    通过在独立模式下使用 URL 打开 HSQL DB 来检查它

    jdbc:hsqldb:file:D:\JavaProj\TmpDBLocation\myKauDB
    

    您应该会看到您的更改保留在 DB 中。

    【讨论】:

      【解决方案6】:

      关闭 sessionfactory 对我有用。

      【讨论】:

        猜你喜欢
        • 2012-11-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-08
        • 1970-01-01
        • 2018-01-21
        • 1970-01-01
        相关资源
        最近更新 更多