हमारे पास एक ऐसा एप्लिकेशन है जो डेटाबेस हिट से बचने के लिए हाइबरनेट के दूसरे स्तर के कैशिंग का उपयोग करता है।हाइबरनेट द्वितीय स्तर कैश अमान्यता जब कोई अन्य प्रक्रिया डेटाबेस को संशोधित करती है
मैं सोच रहा था कि क्या जावा अनुप्रयोग के हाइबरनेट द्वितीय स्तर के कैश को अमान्य करने का कोई आसान तरीका है जब एक बाहरी प्रक्रिया जैसे कि MySQL व्यवस्थापक डेटाबेस (अद्यतन/सम्मिलित/हटाएं) को संशोधित करने के लिए सीधे कनेक्ट होता है।
हम अपने दूसरे स्तर के कैश कार्यान्वयन के रूप में EHCache का उपयोग कर रहे हैं।
हम @Cache (उपयोग = CacheConcurrencyStrategy.READ_WRITE) और @Cache (उपयोग = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) के मिश्रण का इस्तेमाल, और हम आशावादी संगामिति नियंत्रण प्रत्येक इकाई के टाइमस्टैम्प का उपयोग करते हुए सक्षम नहीं है। हमारे लिए "मज़बूती से" (उदाहरण के लिए कोई मैनुअल के लिए Managing the Caches
sessionFactory.evict(Cat.class, catId); //evict a particular Cat
sessionFactory.evict(Cat.class); //evict all Cats
sessionFactory.evictCollection("Cat.kittens", catId); //evict a particular collection of kittens
sessionFactory.evictCollection("Cat.kittens"); //evict all kitten collections
लेकिन क्योंकि हम @Cache साथ अलग-अलग इकाई वर्गों व्याख्या, वहाँ कोई केंद्रीय स्थान है - :
SessionFactory 2 स्तर कैश का प्रबंधन करने के तरीकों में शामिल है कदम) सूची में जोड़ें।
// Easy to forget to update this to properly evict the class
public static final Class[] cachedEntityClasses = {Cat.class, Dog.class, Monkey.class}
public void clear2ndLevelCache() {
SessionFactory sessionFactory = ... //Retrieve SessionFactory
for (Class entityClass : cachedEntityClasses) {
sessionFactory.evict(entityClass);
}
}
हाइबरनेट के 2 स्तर कैश के लिए कोई असली तरीका पता चला है कि एक इकाई डीबी में बदल जब तक यह क्वेरी जिनका इकाई (जो क्या कैश आप से सुरक्षा कर रहा है) नहीं है। तो हो सकता है कि एक समाधान के रूप में हम केवल दूसरे स्तर के कैश को सब कुछ बेदखल करने के लिए मजबूर करने के लिए कुछ विधि कह सकते हैं (फिर से लॉकिंग और समवर्ती नियंत्रण की कमी के कारण आपको "पढ़ने" या स्टाइल डेटा अपडेट करने से प्रगति लेनदेन में जोखिम होता है)।
मैं नीचे विधि कॉल करके दूसरे स्तर के कैश से कैश डेटा साफ़ करना चाहता हूं: - sessionFactory.getCache()। EvictEntityRegions(); मैं बस जानना चाहता हूं, क्या ऐसा करने में कोई हानि है? उदाहरण के लिए: - लेनदेन के बीच में कैश साफ़ करने का प्रयास करने पर क्या होगा? –