2010-11-30 13 views
7

Tengo dos aplicaciones diferentes que comparten la misma base de datos. El problema es que cuando tengo una aplicación, cambio algo en la base de datos, la otra no se actualiza.Java: Hibernate no ve cambios en DataBase

Intenté hacer un session.flush() pero no funcionó. La única forma es cerrar toda la sesión y volver a crearla, pero, por supuesto, eso lleva demasiado tiempo.

+0

Cerrar todas las sesiones no ayuda. ¿Estás seguro de que funcionó en tu caso? –

Respuesta

0

No he probado esto, pero la clase Session tiene un método claro que expulsa todas las entidades cargadas. Esto debería forzar una recarga desde el db.

+0

limpia la sesión pero no ve cambios en la base de datos – Fernando

1

Si he entendido bien esto es lo que sucede en su escenario:

  • app1 inicia una transacción
  • APP2 (arranques y) sobre otra transacción
  • app1 espera ser capaz de leer los cambios realizados por app2

Si este es el caso, debe verificar su base de datos Isolation levels.

O, por supuesto, podría comenzar una nueva transacción cuando quiera leer datos actualizados. Echa un vistazo a Hibernate transactions documentation

+0

hello En realidad, una aplicación se abre y crea una sesión; de lo contrario, ajuste la base de datos y salga. Para la primera aplicación para consultar la base de datos, no vea ese cambio. He probado con . Clear() . Flush() ... pero nada. – Fernando

2

Respuesta corta: emita un session.refresh(obj) cada vez que desee mostrar algún objeto. Obligará a Hibernate a ir a la base de datos. Otra solución es utilizar un StatelessSession, que no va a almacenar en caché nada (ni siquiera el 1 de caché de nivel), obligando a sus aplicaciones para ir la base de datos cada vez que se necesita un registro:

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/batch.html#batch-statelesssession

Pero por supuesto, si eso es demasiado, entonces se puede considerar el uso de algún tipo de bloqueo (pesimista u optimista):

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/transactions.html#transactions-optimistic

Pero en realidad, si tiene dos sistemas concurrentes diferentes utilizando el mismo registro, no hay nada que Hibernate puede resolver por sí mismo. Es algo que debes considerar en la arquitectura de tus sistemas.

+0

esto funciona en caso de actualización, pero ¿qué ocurre si la aplicación2 ha agregado una nueva fila a la tabla, en cuyo caso la aplicación1 lee solo la tabla en caché y tiene una fila menos? Por favor, avíseme si conoce una respuesta, he estado buscando durante semanas. –

0

Para mí, funciona confirmar la transacción actual y comenzar una nueva después de que la otra aplicación haya aplicado sus modificaciones.

Cuestiones relacionadas