使用Hibernate Search + Infinispan Directory的事务ACID属性

Luc*_*ano 5 java transactions acid hibernate-search infinispan

我有以下设置:

  • JPA(2.0)通过Hibernate(4.1)
  • Infinispan作为二级缓存(5.1)
  • Hibernate Search连接到Hibernate(4.1)
  • Infinispan作为Hibernate搜索目录(Lucene)
  • 连接Infinispan目录的JDBC CacheStore
  • PostgreSQL(9.1)数据库存储实体和Lucene目录.
  • Bitronix(2.1.2)作为事务管理器
  • 我不是在使用Java EE,而是使用Spring(3.1)

Infinispan作为二级缓存很好,不需要恢复,并且由于Cache的性质,您可以读取自己事务中的更改.

在阅读源代码几小时后,当我更新实体时,Hibernate Search不会更新Lucene目录,但是在事务结束时(如果它提交),所以我想搜索我刚刚更新的文本,在同一笔交易里面,我不能吗?

但是,在事务完成后,Hibernate Search会在不同的线程中对Directory进行更新.因此,如果其中一个目录更新失败,那么Lucene将与我的实体不一致?如果在将更新发送到目录并且需要恢复之前发生了某些事情,这些更新是否会丢失?

假设此"第一"事务成功提交,更新将发送到Infinispan目录.这里将开始一项新交易.通过谁?Lucene可以选择使用JMS发送更新.假设选项已激活,因此JMS消息初始化新事务.

Infinispan将使用它接收的更新修改其内存目录,但是在提交后,持久的CacheStore将在此事务完成时再次更新.因此,如果在更新jdbc CacheStore时发生某些事情,它将有可能没有更新,但Infinispan Memory Directory将应用它们.

我的问题是,考虑到我使用的所有模块都支持事务,并且他们甚至支持加入全局事务(XA),是否有办法实现真正​​的事务性?也许我只是没有看到它.

小智 0

我正在研究一个非常相似的设置。对于这些版本,真正的事务性是不可能的。有几个原因,您已经注意到其中一些原因:

  1. Hibernate Search 在提交阶段进行索引更新
  2. Hibernate Search 在后台线程上进行处理 - 即使是“同步”时
  3. Infinispan 缓存存储更新在提交阶段完成

这里事务阶段很重要,因为最终插入数据库需要在事务主体中完成并在最后提交。

我的解决方案是忽略索引更新的事务性,在我的情况下这并不是绝对必要的。