2012-04-13 58 views
5

tôi đã thiết lập sau:tính giao dịch ACID với Hibernate Search + Infinispan mục

  • JPA (2.0) thông qua Hibernate (4,1)
  • Infinispan như bộ nhớ cache cấp 2 (5,1)
  • Hibernate Tìm kiếm kết nối để Hibernate (4.1)
  • Infinispan as Directory cho Hibernate Search (Lucene)
  • Đã kết nối với JDBC CacheStore cho thư mục Infinispan
  • Cơ sở dữ liệu PostgreSQL (9.1) để lưu trữ cả hai thực thể và thư mục Lucene.
  • Bitronix (2.1.2) như quản lý giao dịch
  • tôi không sử dụng Java EE, nhưng mùa xuân (3,1)

Infinispan như Second Level Cache là tốt, không phục hồi là cần thiết và bạn có thể đọc thay đổi trong giao dịch của riêng bạn vì bản chất của Cache. Sau khi giờ đọc mã nguồn, khi tôi cập nhật thực thể, Hibernate Search không cập nhật Thư mục Lucene nhưng ở cuối giao dịch (nếu nó cam kết), vì vậy tôi muốn tìm kiếm văn bản tôi ' đã cập nhật, bên trong cùng một giao dịch, tôi sẽ không thể?

Nhưng hơn nữa, Hibernate Search thực hiện cập nhật cho Thư mục trong một luồng khác, sau khi hoàn thành giao dịch. Vì vậy, nếu một trong những cập nhật thư mục không thành công, thì Lucene sẽ không phù hợp với các thực thể của tôi? Và nếu có điều gì đó xảy ra trước khi các bản cập nhật được gửi đến Thư mục và cần khôi phục, các bản cập nhật đó có bị mất không?

Giả sử giao dịch "đầu tiên" này được thực hiện thành công, các cập nhật đã được gửi đến Thư mục Infinispan. Giao dịch mới sẽ được bắt đầu tại đây. Bởi ai? Lucene có các tùy chọn để gửi các bản cập nhật bằng cách sử dụng JMS. Giả sử tùy chọn đó được kích hoạt, vì vậy thông báo JMS khởi tạo giao dịch mới.

Infinispan sẽ sửa đổi thư mục bộ nhớ của nó với các bản cập nhật nhận được, nhưng CacheStore liên tục sẽ lại được cập nhật tại giao dịch này sau khi cam kết. Do đó có một cơ hội nếu có điều gì xảy ra trong khi cập nhật jdbc CacheStore, nó sẽ bị bỏ lại mà không có bản cập nhật nào, nhưng Infinispan Memory Directory sẽ áp dụng chúng.

Câu hỏi của tôi là, xem xét tất cả các mô-đun tôi đang sử dụng giao dịch hỗ trợ và thậm chí họ hỗ trợ tham gia giao dịch toàn cầu (XA), là có cách nào để đạt được giao dịch thực sự không? Có lẽ tôi không thấy nó.

Trả lời

0

Tôi đang làm việc trên một thiết lập rất giống nhau. Với những phiên bản này, giao dịch thực sự là không thể.Có một vài lý do, một số trong đó bạn đã lưu ý:

  1. Hibernate kiếm không cập nhật chỉ mục trong cam giai đoạn
  2. Hibernate quá trình tìm kiếm trên chủ đề nền - ngay cả khi 'đồng bộ'
  3. cửa hàng bộ nhớ cache Infinispan cập nhật được thực hiện trong cam giai đoạn

đây là giai đoạn giao dịch là quan trọng như chèn cuối cùng vào cơ sở dữ liệu cần phải được thực hiện trong o cơ thể chính f giao dịch và cam kết cuối cùng.

Giải pháp của tôi là bỏ qua giao dịch cho các cập nhật chỉ mục, nó không thực sự cần thiết trong trường hợp của tôi.

Các vấn đề liên quan