带有 Hibernate Search + Infinispan 目录的事务 ACID 属性
Posted
技术标签:
【中文标题】带有 Hibernate Search + Infinispan 目录的事务 ACID 属性【英文标题】:Transaction ACID properties with Hibernate Search + Infinispan Directory 【发布时间】: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),有没有办法实现真正的事务性?也许我只是没看到。
【问题讨论】:
【参考方案1】:我正在做一个非常相似的设置。使用这些版本,真正的事务性是不可能的。有几个原因,您已经注意到其中一些原因:
-
Hibernate Search 在提交阶段进行索引更新
后台线程上的休眠搜索进程 - 即使是“同步”时也是如此
Infinispan 缓存存储更新在提交阶段完成
这里的事务阶段很重要,因为最终插入数据库需要在事务的主体中完成并在最后提交。
我的解决方案是忽略索引更新的事务性,在我的情况下这不是绝对必要的。
【讨论】:
以上是关于带有 Hibernate Search + Infinispan 目录的事务 ACID 属性的主要内容,如果未能解决你的问题,请参考以下文章
如何使用带有通配符查询的 Hibernate Search 并输出结果对象列表
使用 GAE 的 Hibernate 的访问被拒绝 WEB-INF/类
如何使用gradle获取Hibernate Search Lucene的所有依赖项?
Hibernate Search 手动索引抛出“org.hibernate.TransientObjectException:实例未与此会话关联”