繁体   English   中英

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

[英]Transaction ACID properties with Hibernate Search + Infinispan Directory

我有以下设置:

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM