Tôi có một ứng dụng sử dụng JPA, Hibernate và ehcache, cũng như các giao dịch khai báo của Spring. Tải trên DB khá cao nên mọi thứ được lưu trữ để tăng tốc độ, bao gồm cả bộ sưu tập. Bây giờ không phải là bí mật mà các bộ sưu tập được lưu trữ riêng biệt từ các thực thể sở hữu chúng vì vậy nếu tôi xóa một thực thể là một phần tử của bộ sưu tập được lưu trong bộ nhớ cache này, hãy giữ nguyên một phần tử hoặc cập nhật thực thể sao cho nó di chuyển từ bộ sưu tập này sang bộ sưu tập khác, tôi phải thực hiện việc gỡ bỏ bằng tay.Hibernate/Ehcache: gỡ bỏ các bộ sưu tập từ bộ nhớ cache cấp 2 không đồng bộ với DB khác đọc
Vì vậy, tôi sử dụng trình nghe sự kiện ngủ đông theo dõi các thực thể được chèn, xóa hoặc cập nhật và lưu thông tin đó cho đồng bộ hóa giao dịch đã đăng ký với người quản lý giao dịch của Spring. Việc đồng bộ hóa sau đó thực hiện việc hủy bỏ khi giao dịch được thực hiện.
Bây giờ vấn đề là đó khá thường xuyên, một số giao dịch đồng thời khác quản lý để tìm một bộ sưu tập trong bộ nhớ cache vừa bị đuổi ra (những sự kiện này thường phần mười của một giây ngoài theo log) và, một cách tự nhiên , gây ra một EntityNotFoundException xảy ra.
Làm cách nào để đồng bộ hóa nội dung này chính xác?
Tôi đã cố gắng thực hiện lệnh đuổi theo trong 4 phương thức của TransactionSynchronization (trong đó được gọi tại các thời điểm khác nhau liên quan đến hoàn thành giao dịch).
Người ta đuổi bên ngoài của một giao dịch, nhân tiện. Và tôi phải tìm API để đánh dấu chúng bẩn, cảm ơn.Ngoài ra, làm thế nào để làm cho Hibernate đồng bộ hóa trên khóa mà bạn đã đề xuất thêm? –
Rõ ràng, cờ bẩn của PersistentCollection sẽ không làm, bởi vì các giao dịch khác nhau có được các phiên bản khác nhau của cùng một bộ sưu tập . Đối với khóa, tôi sẽ xem xét điều đó tiếp theo, và sẽ thực sự đánh giá cao nếu ai đó chỉ cho tôi API thích hợp. EhCache không hỗ trợ khóa theo như tôi biết, nhìn vào điều đó điều đầu tiên. –