5

我有以下设置:

  • JPA (2.0) 到 Hibernate (4.1)
  • Infinispan 作为二级缓存 (5.1)
  • Hibernate Search 连接到 Hibernate (4.1)
  • 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 内存目录将应用它们。

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

4

1 回答 1

0

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

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

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

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

于 2014-10-03T20:11:15.550 回答