2012-04-13 18 views
5

He la siguiente configuración:propiedades de transacciones ACID con Hibernate Búsqueda + Infinispan Directorio

  • APP (2.0) a través de Hibernate (4.1)
  • Infinispan como segundo caché de nivel (5.1)
  • Hibernate Buscar conectado a Hibernate (4,1)
  • Infinispan como Directorio de Hibernate Search (Lucene)
  • conectado un JDBC cachestore para el Directorio Infinispan
  • Base de datos PostgreSQL (9.1) para almacenar ambas entidades y el directorio Lucene.
  • Bitronix (2.1.2) como administrador de transacciones
  • no estoy usando Java EE, pero la primavera (3,1)

Infinispan como segundo nivel de caché está bien, no se necesita la recuperación y se puede leer cambios en su propia transacción debido a la naturaleza de la Caché.

Después de horas leyendo los códigos fuente, cuando actualizo una entidad, la búsqueda de Hibernación no actualiza el directorio de Lucene, pero al final de la transacción (si confirma), entonces quería hacer una búsqueda del texto I ' acabo de actualizar, dentro de la misma transacción, ¿no podría?

Pero, además, Hibernate Search hace las actualizaciones del Directorio en un hilo diferente, después de la finalización de la transacción. Entonces, si una de las Actualizaciones del Directorio falla, entonces ¿Lucene será inconsistente con mis entidades? Y si algo sucedió antes de que las actualizaciones fueran enviadas al Directorio y se necesitara una recuperación, ¿se perderían esas actualizaciones?

Suponiendo que esta "primera" transacción se haya realizado correctamente, las actualizaciones se enviaron al Directorio de Infinispan. Una nueva transacción se iniciará aquí. ¿Por quién? Lucene tiene la opción de enviar las actualizaciones usando JMS. Supongamos que esa opción está activada, por lo que el mensaje JMS inicializa la nueva transacción.

Infinispan modificará su directorio de memoria con las actualizaciones que reciba, pero el CacheStore persistente se actualizará de nuevo en esta finalización de la transacción, después de la confirmación. Por lo tanto, existe la posibilidad de que si ocurre algo mientras se actualiza el Jdbc CacheStore, se quede sin actualizaciones, pero Infinispan Memory Directory los tendrá aplicados.

Mi pregunta es, teniendo en cuenta que todos los módulos que estoy usando soportan transacciones, y que incluso soportan unirse a transacciones globales (XA), ¿hay alguna manera de lograr una verdadera transaccionalidad? Tal vez simplemente no lo estoy viendo.

Respuesta

0

Estoy trabajando en una configuración muy similar. Con estas versiones, la verdadera transaccionalidad no es posible.Hay algunas razones, algunas de las cuales usted ha señalado:

  1. Hibernate Buscar hace las actualizaciones del índice en cometer fase
  2. Hibernate procesos de búsqueda de subprocesos de fondo - incluso cuando 'síncrona'
  3. almacén de caché Infinispan actualizaciones se realizan en cometer fase

Aquí la fase de transacción es importante como los insertos eventuales en la base de datos necesitan ser hechas en el cuerpo principal o f la transacción y comprometido al final.

Mi solución fue ignorar la transaccionalidad para las actualizaciones de índice, no era estrictamente necesario en mi caso.

Cuestiones relacionadas