2012-04-13 13 views
5

Ich habe die folgende Konfiguration:Transaktion ACID-Eigenschaften mit Hibernate Search + Infinispan Verzeichnis

  • JPA (2.0) durch Hibernate (4.1)
  • Infinispan als 2. Level-Cache (5.1)
  • Hibernate Search verbunden Hibernate (4,1)
  • Infinispan als Verzeichnis für Hibernate Search (Lucene)
  • Verbunde ein JDBC-CacheStor für die Infinispan Verzeichnis
  • PostgreSQL (9.1) -Datenbank zum Speichern von Entitäten und Lucene-Verzeichnis.
  • Bitronix (2.1.2) als Transaction Manager
  • Ich bin nicht mit Java EE, aber Frühling (3,1)

Infinispan als Second Level Cache in Ordnung ist, keine Wiederherstellung benötigt wird, und Sie können lesen Änderungen in Ihrer eigenen Transaktion aufgrund der Art des Cache.

Nach Stunden lesen Quellcodes, wenn ich eine Entität aktualisieren, aktualisiert Hibernate Search nicht das Lucene-Verzeichnis, aber am Ende der Transaktion (wenn es commits), also wollte ich eine Suche nach dem Text I 'tun Ich habe gerade aktualisiert, innerhalb der gleichen Transaktion, würde ich nicht in der Lage sein?

Darüber hinaus führt die Hibernate-Suche die Aktualisierungen für das Verzeichnis nach Abschluss der Transaktion in einem anderen Thread durch. Wenn also eine der Verzeichnisaktualisierungen fehlschlägt, ist Lucene für meine Entitäten inkonsistent? Und wenn etwas passiert ist, bevor die Updates an das Verzeichnis gesendet wurden und eine Wiederherstellung erforderlich war, würden diese Updates verloren gehen?

Wenn diese "erste" Transaktion erfolgreich ausgeführt wurde, wurden die Aktualisierungen an das Infinispan-Verzeichnis gesendet. Eine neue Transaktion würde hier gestartet werden. Von wem? Lucene hat die Möglichkeit, die Updates über JMS zu senden. Nehmen wir an, diese Option ist aktiviert, sodass die JMS-Nachricht die neue Transaktion initialisiert.

Infinispan ändert sein Speicherverzeichnis mit den Updates, die es empfängt, aber der persistente CacheStore wird bei diesem Transaktionsabschluss nach dem Festschreiben erneut aktualisiert. Es besteht daher die Möglichkeit, dass beim Aktualisieren des jdbc-CacheStore keine Aktualisierungen vorgenommen werden, die jedoch im Infinispan-Speicherverzeichnis angewendet werden.

Meine Frage ist, in Anbetracht der Tatsache, dass alle Module, die ich unterstütze Transaktionen, und dass sie sogar Beitritt zu globalen Transaktionen (XA) unterstützen, gibt es eine Möglichkeit, echte Transaktionalität zu erreichen? Vielleicht sehe ich es einfach nicht.

Antwort

0

Ich arbeite an einem sehr ähnlichen Setup. Mit diesen Versionen ist keine echte Transaktionalität möglich.Es gibt ein paar Gründe, von denen einige Sie festgestellt haben:

  1. Hibernate Search tut Indexaktualisierungen in Phase
  2. Hibernate Search Prozesse auf Hintergrund-Threads begehen - auch wenn 'synchrone'
  3. Infinispan Cache-Speicher Updates wird in getan Phase

Hier die Transaktionsphase ist wichtig, begehen, da die eventuellen Einsätze in die Datenbank in dem Hauptkörper o durchgeführt werden müssen f die Transaktion und am Ende begangen.

Meine Lösung war die Transaktionalität für Index-Updates zu ignorieren, es war in meinem Fall nicht unbedingt notwendig.

Verwandte Themen