2010-08-23 25 views
24

Algo de un novato con HSQL e Hibernate ...HSQLDB e Hibernate/JPA: ¿no persiste en el disco?

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

seguido de ...

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

imprime 25000 (el número de objetos de actividad en las actividades). Pero cuando vuelvo a ejecutar esta prueba, la cantidad de objetos en el conteo (*) no aumenta (y es 0 al comienzo del programa). Entonces los objetos no se escriben de forma duradera.

Esta es mi cadena de conexión hsqldb:

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

por lo que no es una base de datos en memoria por lo que yo sé ...

¿Alguien tiene alguna idea de por qué los objetos no están recibiendo persistió más allá de una sola sesión de JVM? Feliz de proporcionar más información, pero hay tanto estado asociado con Hibernate/JPA/HSQL que no está claro exactamente lo que es pertinente.

+0

Como otro punto de datos, los INSERTES de la última ejecución están en data/cmon.log, que se borra al inicio y se reemplaza. Tal vez haya una opción para forzar la repetición de registro al inicio? – HenryR

+0

Esto significa que el registro tiene lugar. Informe el tamaño de .log y de cualquier archivo .script en ese directorio. También la versión de HSQLDB que está usando. – fredt

+0

@fredt - Hibernate 1.8.0. El tamaño del registro es de aproximadamente 4 MB, alrededor de 37000 declaraciones de inserción. cmon.script tiene 1.9 KB y curiosamente termina con SET WRITE_DELAY 10, lo que hace que parezca que mis cambios en la cadena de conexión no funcionan. – HenryR

Respuesta

29

¿Alguien tiene alguna idea de por qué los objetos no persisten más allá de una sola sesión de JVM?

HSQLDB no escribe cambios inmediatamente en el disco después de una confirmación (ver "WRITE DELAY"), HSQLDB no es duradero por defecto (que es desde donde 'actuaciones' están viniendo).

O intente configurar la propiedad de conexión shutdown=true en la cadena de conexión para obtener los cambios escritos cuando finalice la última conexión.

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

Si no ayuda, trate de establecer el WRITE DELAY a 0 (o falsa). Si utiliza HSQLDB 1.8.x, utilice el comando SQL:

SET WRITE_DELAY 0 

Si utiliza HSQLDB 2.0.x, ahora se puede también utilizar una conexión propertyhsqldb.write_delay:

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

Gracias, lo intentaré. Así que confirmar una transacción no garantiza la persistencia, parece, eso es un poco contrario a la intuición. – HenryR

+0

@HenryR: Eso es exactamente, HSQLDB no es Durable ** por defecto **. (En realidad, HSQLDB no es A (C) ID). –

+0

@Pascal Thivent - gracias, desafortunadamente eso no parece haber funcionado.Mi cadena de conexión es jdbc: hsqldb: file: data/cmon; hsqldb.write_delay = 0; shutdown = true y todavía no hay durabilidad (hbm2ddl.auto aún está configurado para 'actualizar') – HenryR

7

¿Ha establecido hibernate.hbm2ddl.auto en create-drop en su persistence.xml? Esto suelta sus tablas y las vuelve a crear en cada inicio.

En su lugar, puede configurarlo en update, o si desea administrar el esquema usted mismo, configúrelo en validate.

+1

Gracias - está configurado para "actualizar", así que no estoy seguro de si ese es el problema :( – HenryR

9

La solución es:

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

en hibernate.cfg.xml


Esta es resto de mi configuración:

Liberaciones:

  • hsqldb 2.0.0
  • Hibernate 3.5.6

Url:

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

Usted hizo mi día, ese problema me costó algunas horas. +1 y gracias :) – BitSchupser

+0

Funcionó para mí ya que uso HSQL DB 2.2.4. ¡Muchas muchas gracias! – mvmn

+3

¿Por qué esto resuelve el problema? –

3

simplemente cierra la EntityManagerFactory con HSQL en fileMode, después de la confirmación de persistir realmente datas más ...

3

que estaba usando HSQL DB versión 2.2.5. Probé los enfoques anteriores, es decir, configuración shutdown = true y hsqldb.write_delay = false No funcionó. Como se sugirió en algunos blogs, agregué la declaración

org.hsqldb.DatabaseManager.closeDatabases(0); 

después de la confirmación de transacción. Pero no funcionó.

HSQL DB versión 2.2.9 parece mejor que esto. Con una solución, resuelve este problema. Para manejar el problema anterior tome los siguientes pasos: -

1) hsqldb.jar de lib de HSQL DB versión 2.2.9

2) En hibernación xml de configuración basta con especificar la URL estoy usando la base de datos basada en archivos HSQL.

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

3) En su programa en la declaración final de escritura

org.hsqldb.DatabaseManager.closeDatabases(0); 

Ahora ejecuta el programa de hibernación que compromete a los datos DB.

Compruebe HSQL DB abriéndolo en modo autónomo y con el URL

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

Debería ver los cambios persistieron en el PP.

1

Cerrando sessionfactory funcionó para mí.

Cuestiones relacionadas