簡體   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