द्वारा किए गए परिवर्तनों मैं उपयोग कर रहा हूँ एक PostUpdateEventListener
आदेश हाइबरनेट द्वारा किए गए परिवर्तनों को ट्रैक करने में के माध्यम सेमज़बूती पर नज़र रखने के हाइबरनेट
registry.appendListeners(EventType.POST_COMMIT_UPDATE, listener)
और कुछ अन्य श्रोताओं पंजीकृत। यह पूरी तरह से काम करता है, फिर भी, मैं एक समस्या देखें:
मान लें, id
से कुछ amount
नज़र रखने के लिए, मैं बस हर POST_COMMIT_UPDATE
पर अमल
amountByIdConcurrentMap.put(id, amount);
(के अन्य कार्यों की अनदेखी करते हैं)। समस्या यह है कि यह कॉल प्रतिबद्धता के बाद कुछ समय होता है। तो दो के साथ एक ही इकाई को एक दूसरे के बाद जल्द ही लिखने के लिए, मैं गलत क्रम में ईवेंट प्राप्त कर सकता हूं, पुराने amount
संग्रहीत के साथ समाप्त हो रहा है।
- क्या यह वास्तव में संभव है या ऑपरेशन किसी भी तरह सिंक्रनाइज़ किए गए हैं?
- क्या ऐसी कोई स्थिति है जिससे कम से कम ऐसी स्थिति को कैसे रोकें या कम से कम कैसे पता चल सके?
मैं वास्तव में आशावादी लॉकिंग का उपयोग कर रहा हूं, इसलिए संभवतः मुझे टाइममैंप की तुलना करने के लिए कुछ भी नहीं चाहिए, जैसे 'map.compute (id, (k, v) -> v == null || timestamp.isAfter (v.timestamp)? नया मूल्य (टाइमस्टैम्प, राशि): v) '। यह वास्तव में सरल लगता है। – maaartinus
मार्टिनस ठीक है, लेकिन यह परिवर्तन विशेष रूप से करना सुनिश्चित करें। बीच के बीच और मूल्य निर्धारित करने के बाद एक और थ्रेड सामग्री – aschoerk
मार्टिनस बदल सकता है और, क्लस्टर्ड वातावरण में, जागरूक रहें कि यदि आप वितरित नहीं होते हैं, तो इन्फिनिसन की तरह, आपको कैश में नवीनतम मान नहीं दिखाई दे सकता है। – aschoerk