У меня следующая установка:
- 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), есть ли способ достичь истинной транзакционности? Может быть, я просто не видя этого.