2011-12-28 39 views
11

Tôi đang cố gắng tìm ra chiến lược đồng thời bộ nhớ cache nào tôi nên sử dụng cho ứng dụng của mình (đặc biệt là bản cập nhật đối tượng). Ứng dụng này là một dịch vụ web được phát triển bằng Hibernate, được triển khai trên cụm Amazon EC2 và hoạt động trên Tomcat, vì vậy không có máy chủ ứng dụng nào ở đó.Bộ nhớ cache Hibernate L2. Đọc-ghi hoặc giao dịch cache chiến lược đồng thời trên cluster?

Tôi biết rằng có nonstrict-đọc-viết \ đọc-viếtgiao dịch chiến lược đồng thời bộ nhớ cache cho dữ liệu có thể được cập nhật và có trưởng thành, sản xuất sẵn sàng cung cấp bộ nhớ cache phổ biến 2L cho Hibernate: Infinispan, Ehcache, Hazelcast.

Nhưng tôi không hoàn toàn hiểu sự khác biệt giữa các kho lưu trữ giao dịchđọc-ghi lưu trữ từ tài liệu Hibernate. Tôi nghĩ rằng bộ nhớ cache giao dịch là sự lựa chọn duy nhất cho một ứng dụng cụm, nhưng bây giờ (sau khi đọc một số chủ đề), tôi không chắc chắn về điều đó.

Vì vậy, câu hỏi của tôi là về bộ nhớ cache đọc-ghi. Nó có an toàn không? Liệu nó có đảm bảo đồng bộ dữ liệu giữa cơ sở dữ liệu và bộ đệm cũng như đồng bộ hóa giữa tất cả các máy chủ được kết nối không? Hoặc nó chỉ thích hợp cho các ứng dụng máy chủ đơn và tôi nên luôn thích bộ nhớ cache giao dịch? Ví dụ: nếu giao dịch cơ sở dữ liệu đang cập nhật trường thực thể (tên, v.v.) không thành công và đã được khôi phục, bộ nhớ cache đọc-ghi sẽ hủy thay đổi hoặc nó sẽ chỉ điền dữ liệu không hợp lệ (tên được cập nhật) cho tất cả các nút khác? Có yêu cầu giao dịch JTA cho việc này không?

Chủ đề Concurrency strategy configuration for JBoss TreeCache as 2nd level Hibernate cache nói:

'READ_WRITE` là một sự kết hợp thú vị. Trong chế độ này, chế độ Hibernate hoạt động như một điều phối viên XA nhẹ, do đó, nó không yêu cầu XA bên ngoài đầy đủ. Mô tả ngắn về cách hoạt động:

  1. Trong chế độ này Hibernate tự quản lý giao dịch. Tất cả các hành động DB phải nằm trong giao dịch, chế độ tự động không hoạt động.
  2. Trong lần xả() (có thể xuất hiện nhiều lần trong thời gian thời gian giao dịch, nhưng thường xảy ra ngay trước cam kết) Hibernate đi qua một phiên và tìm kiếm các đối tượng được cập nhật/chèn/xóa. Các đối tượng này sau đó được lưu lần đầu tiên vào cơ sở dữ liệu, sau đó khóa và cập nhật trong bộ nhớ cache để các giao dịch đồng thời không thể cập nhật hoặc đọc chúng.
  3. Nếu giao dịch sau đó được cuộn lại (một cách rõ ràng hoặc vì một số lỗi ), các đối tượng bị khóa sẽ được giải phóng và gỡ bỏ khỏi bộ nhớ cache , vì vậy các giao dịch khác có thể đọc/cập nhật chúng.
  4. Nếu giao dịch được thực hiện thành công, thì các đối tượng bị khóa là đơn giản được phát hành và các chủ đề khác có thể đọc/ghi chúng.

Có một số tài liệu về cách hoạt động của môi trường cụm sao?

Dường như bộ nhớ cache giao dịch hoạt động chính xác cho điều này, nhưng yêu cầu môi trường JTA với trình quản lý giao dịch độc lập (như JBossTM, Atomikos, Bitronix), nguồn dữ liệu XA và nhiều thay đổi cấu hình và thử nghiệm. Tôi quản lý để triển khai điều này, nhưng vẫn có một số vấn đề với khung của tôi. Ví dụ, Google Guice IoC không hỗ trợ các giao dịch JTA và tôi phải thay thế nó bằng Spring hoặc di chuyển dịch vụ tới một số máy chủ ứng dụng và sử dụng EJB.

Vậy cách nào tốt hơn?

Cảm ơn trước!

Trả lời

4

Cho đến nay tôi chỉ thấy cụm 2LC hoạt động với các chế độ bộ đệm giao dịch. Đó chính xác là những gì Infinispan làm, và trên thực tế, Infinispan đã cho đến nay tránh xa việc triển khai các chế độ đồng bộ cache khác. Để làm giảm gánh nặng giao dịch, Infinispan tích hợp thông qua đồng bộ hóa giao dịch với Hibernate thay vì XA.

+0

Bạn có ý nói rằng chiến lược bộ nhớ đệm đọc ghi là cụm an toàn nhưng hầu hết thời gian giao dịch đang được sử dụng? –

+2

Không. Đọc-ghi có thể làm cho mọi thứ nhất quán, nhưng nó cần phải có một số loại phương pháp 2PC hoặc khác để đảm bảo tính thống nhất trong một cụm. Đó là vào việc thực hiện 2LC. Infinispan choses để bỏ qua đọc-ghi và sử dụng các giao dịch, được sử dụng để bao gồm tất cả các hoạt động và hành động nguyên tử xung quanh cụm. –

16

Tóm tắt thông tin về sự khác biệt

  • NonStrict R/w và R/w là cả hai chiến lược không đồng bộ, có nghĩa là họ được cập nhật sau khi giao dịch được hoàn tất.
  • Giao dịch là rõ ràng là đồng bộ và được cập nhật trong giao dịch.
  • Không đúng R/w không bao giờ khóa một thực thể, do đó, luôn có khả năng số bị đọc.
  • Đọc-ghi luôn luôn mềm khóa một thực thể, vì vậy bất kỳ truy cập đồng thời nào sẽ được gửi đến cơ sở dữ liệu. Tuy nhiên, có một cơ hội từ xa mà R/w có thể không tạo ra chế độ Cô lập đọc lặp lại.

Cách tốt nhất để hiểu sự khác biệt giữa các chiến lược này là để xem cách chúng hoạt động trong quá trình thực hiện thao tác Chèn, cập nhật hoặc xóa.

Bạn có thể xem bài đăng của tôi here mô tả sự khác biệt trong chi tiết hơn. Hãy bình luận.

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