【问题标题】:Transaction ACID properties with Hibernate Search + Infinispan Directory带有 Hibernate Search + Infinispan 目录的事务 ACID 属性
【发布时间】:2012-04-26 01:02:33
【问题描述】:

我有以下设置:

  • 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),有没有办法实现真正​​的事务性?也许我只是没看到。

【问题讨论】:

    标签: java transactions hibernate-search acid infinispan


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-12-14
      • 1970-01-01
      • 2014-11-09
      • 2017-11-09
      • 2019-01-20
      • 1970-01-01
      • 1970-01-01
      • 2020-02-22
      • 2018-06-04
      相关资源
      最近更新 更多