Свойства ACID транзакции с Hibernate Search + Infinispan Directory

У меня следующая установка:

  • JPA (2.0) через Hibernate (4.1)
  • Infinispan как кеш 2-го уровня (5.1)
  • Hibernate Search подключен к Hibernate (4.1)
  • Infinispan как каталог для поиска гибернации (Lucene)
  • Подключили JDBC CacheStore для Infinispan Directory
  • База данных PostgreSQL (9.1) для хранения как сущностей, так и каталога Lucene.
  • Bitronix (2.1.2) в качестве менеджера транзакций
  • Я не использую Java EE, но Spring (3.1)

Infinispan в качестве кэша второго уровня подходит, восстановление не требуется, и вы можете считывать изменения в своей собственной транзакции из-за природы кеша.

После нескольких часов чтения исходных кодов, когда я обновляю Entity, Hibernate Search обновляет не каталог Lucene, а в конце транзакции (если она фиксируется), поэтому я хотел выполнить поиск только что обновленного текста, внутри той же транзакции, разве я не смогу?

Но, кроме того, Hibernate Search выполняет обновления каталога в другом потоке после завершения транзакции. Значит, если одно из обновлений каталога не удастся, то Lucene будет несовместима с моими объектами? И если что-то произойдет до того, как обновления будут отправлены в каталог и потребуется восстановление, будут ли эти обновления потеряны?

Если предположить, что эта «первая» транзакция завершена успешно, обновления были отправлены в каталог Infinispan. Здесь будет начата новая транзакция. Кем? Lucene имеет возможность отправлять обновления с помощью JMS. Допустим, эта опция активирована, поэтому сообщение JMS инициализирует новую транзакцию.

Infinispan изменит свой каталог памяти с полученными обновлениями, но постоянное хранилище CacheStore снова будет обновлено по завершении этой транзакции после фиксации. Поэтому есть вероятность, что если что-то произойдет при обновлении jdbc CacheStore, он останется без обновлений, но Infinispan Memory Directory их применит.

У меня вопрос, учитывая, что все модули, которые я использую, поддерживают транзакции, и что они даже поддерживают присоединение к глобальным транзакциям (XA), есть ли способ достичь истинной транзакционности? Может быть, я просто не видя этого.


person Luciano    schedule 13.04.2012    source источник


Ответы (1)


Я работаю над очень похожей установкой. В этих версиях истинная транзакционность невозможна. Есть несколько причин, некоторые из которых вы отметили:

  1. Hibernate Search выполняет обновления индекса на этапе фиксации
  2. Процессы Hibernate Search в фоновых потоках - даже в синхронном режиме
  3. Обновления хранилища кэша Infinispan выполняются на этапе фиксации

Здесь важна фаза транзакции, поскольку окончательные вставки в базу данных должны выполняться в основном теле транзакции и фиксироваться в конце.

Мое решение заключалось в том, чтобы игнорировать транзакционность для обновлений индекса, в моем случае это не было строго необходимо.

person Anuj Shah    schedule 03.10.2014