Hibernate Search + Infinispan Directory的事务ACID属性

5
我有以下设置:
  • 通过Hibernate(4.1)使用JPA(2.0)
  • Infinispan作为第二级缓存(5.1)
  • 连接到Hibernate(4.1)的Hibernate Search
  • Infinispan作为Hibernate Search(Lucene)的目录
  • 为Infinispan目录连接了一个JDBC CacheStore
  • PostgreSQL(9.1)数据库用于存储实体和Lucene目录。
  • Bitronix(2.1.2)作为事务管理器
  • 我没有使用Java EE,而是使用Spring(3.1)

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

经过数小时的阅读源代码,当我更新实体时,Hibernate Search没有更新Lucene目录,但在事务结束时(如果提交),它会进行更新,因此,如果我想在同一事务内搜索刚刚更新的文本,我就不能做到吗?

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

假设此“第一”事务成功提交,更新已发送到Infinispan目录。在此处启动新的事务。由谁启动?Lucene有使用JMS发送更新的选项。让我们说该选项已激活,因此JMS消息初始化了新事务。

Infinispan将根据其接收到的更新修改其内存目录,但是持久CacheStore将在此事务完成后再次进行更新,即提交后。因此,如果在更新jdbc CacheStore时发生任何事情,则可能会导致其不具有更新,但是Infinispan Memory Directory将应用这些更新。

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

1个回答

0

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

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

在这里,事务阶段很重要,因为最终插入到数据库中的操作需要在事务的主体部分完成,并在最后进行提交。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接