HSQLDB и Hibernate / JPA - не сохраняются на диск? - PullRequest
24 голосов
/ 24 августа 2010

Что-то новичок с 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 (количество объектов действия в действиях). Но когда я снова запускаю этот тест, количество объектов в count (*) не увеличивается (и равно 0 в начале программы). Таким образом, объекты не пишутся долго.

Это моя строка подключения hsqldb:

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

так что, насколько я знаю, это не база данных в памяти ...

У кого-нибудь есть идеи, почему объекты не сохраняются после одного сеанса JVM? Рад предоставить больше информации, но с Hibernate / JPA / HSQL связано столько состояний, что неясно, что именно уместно.

Ответы [ 6 ]

29 голосов
/ 24 августа 2010

У кого-нибудь есть идеи, почему объекты не сохраняются после одного сеанса JVM?

HSQLDB не записывает изменения сразу на диск после фиксации (см. « ЗАПИСЬ ЗАДЕРЖКИ »), HSQLDB по умолчанию не является долговременным (отсюда и «производительность»from).

Либо попробуйте установить свойство подключения shutdown=true в строке подключения, чтобы получить изменения, записанные после завершения последнего подключения.

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

Если это не поможетпопробуйте установить ЗАПИСЬ ЗАДЕРЖКИ на 0 (или false).Если вы используете HSQLDB 1.8.x, используйте команду SQL:

SET WRITE_DELAY 0

Если вы используете HSQLDB 2.0.x, теперь вы также можете использовать свойство подключения hsqldb.write_delay:

jdbc:hsqldb:file:data/cmon;hsqldb.write_delay=false
9 голосов
/ 27 сентября 2010

Решение:

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

в hibernate.cfg.xml


Это остальная часть моей конфигурации:

Libs:

  • HsqlDb 2.0.0
  • Hibernate 3.5.6

Адрес:

<property name="connection.url">jdbc:hsqldb:file:data/mydb;shutdown=true;hsqldb.write_delay=false;</property>
7 голосов
/ 24 августа 2010

Вы установили hibernate.hbm2ddl.auto в create-drop в своем файле persistence.xml?Это удаляет ваши таблицы и воссоздает их при каждом запуске.

Вместо этого вы можете установить значение update или, если вы хотите управлять схемой самостоятельно, затем установить значение validate.

3 голосов
/ 11 ноября 2012

Я использовал HSQL DB версии 2.2.5. Я попробовал выше подходы, то есть установка shutdown = true и hsqldb.write_delay = false Это не работает. Как предложено в каком-то блоге, я добавил заявление

org.hsqldb.DatabaseManager.closeDatabases(0);

после подтверждения транзакции. Но это не сработало.

HSQL DB версии 2.2.9 кажется лучше, чем эта. С одним обходным путем это решает эту проблему. Для решения вышеуказанной проблемы выполните следующие шаги: -

1) hsqldb.jar из lib базы данных HSQL версии 2.2.9

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

Теперь запустите программу гибернации, которая фиксирует данные в БД.

Проверьте HSQL DB, открыв ее в автономном режиме и с URL

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

Вы должны увидеть, что ваши изменения сохраняются в БД.

3 голосов
/ 02 апреля 2012

Просто закройте вашу EntityManagerFactory с HSQL в файловом режиме, после того как вы действительно сохраните данные ...

1 голос
/ 11 мая 2013

Закрытие сеанс фабрики у меня сработало.

...