आपल्याला क्वेरी कॅशेची आवश्यकता का आहे

HQL मध्‍ये कर्मचार्‍यांसह आमचे उदाहरण पुन्हा लिहू:

Employee director1 = session.createQuery("from Employee where id = 4").uniqueResult();
Employee director2 = session.createQuery("from Employee where id = 4").uniqueResult();

assertTrue(director1 != director2);

अशा प्रश्नांचे परिणाम प्रथम किंवा द्वितीय स्तर कॅशेद्वारे संग्रहित केले जात नाहीत .

इथेच क्वेरी कॅशे वापरली जाऊ शकते . ते डीफॉल्टनुसार अक्षम देखील आहे. ते सक्षम करण्यासाठी, कॉन्फिगरेशन फाइलमध्ये खालील ओळ जोडा:

<property name="hibernate.cache.use_query_cache" value="true"/>

पण हा फक्त अर्धा उपाय आहे. आम्ही क्वेरी कॅशे सक्षम केली आहे, परंतु आम्हाला कोणते क्वेरी परिणाम कॅशे करायचे आहेत हे देखील निर्दिष्ट करणे आवश्यक आहे. हे क्वेरीमध्ये लिहिले जाणे आवश्यक आहे:

Query query = session.createQuery("from Employee where id = 4");
query.setCacheable(true);
Employee director1 = query.uniqueResult();

क्वेरी कॅशे दुसऱ्या लेव्हल कॅशे प्रमाणेच आहे. परंतु, याच्या विपरीत, येथे कॅशे डेटाची की ऑब्जेक्ट आयडेंटिफायर नाही, परंतु क्वेरी पॅरामीटर्सचा संच आहे. आणि डेटा स्वतःच क्वेरी निकषांशी जुळणार्‍या ऑब्जेक्ट्सचे अभिज्ञापक आहे. अशा प्रकारे, हे कॅशे दुसऱ्या स्तरावरील कॅशेसह वापरणे तर्कसंगत आहे.

कॅशे साफ करत आहे

कॅशेसह कार्य करताना एक महत्त्वाचे कार्य म्हणजे कॅशे केलेल्या वस्तू बदलल्या आहेत याची खात्री करणे आणि त्यांना कॅशेमधून काढून टाकणे (किंवा त्यांना अद्यतनित करणे). हायबरनेट हे खूप चांगले करते. कधीकधी असे दिसते की त्याला "कोणत्याही न समजण्याजोग्या परिस्थितीत कॅशे साफ करा" या नियमाने मार्गदर्शन केले आहे.

समजा तुम्हाला HQL द्वारे वापरकर्ता डेटा अपडेट करायचा आहे:

Query query = session.createQuery("update Employee set name=’Alex’ where id = 4")
query. executeUpdate();

डेटाबेसमध्ये नेमके काय बदलले आहे हे हायबरनेटला कळू शकत नाही, परंतु आपण एम्प्लॉई ऑब्जेक्ट बदलत आहात हे त्याला माहीत आहे. म्हणून, ही क्वेरी कार्यान्वित केल्यानंतर, हायबरनेट कर्मचारी प्रकारातील सर्व ऑब्जेक्ट्स त्याच्या कॅशेमधून हटवेल .

परंतु NativeQuery आणखी मनोरंजक कार्य करते:

Query nativeQuery = session.createNativeQuery("update employee set name=’Alex’ where id = 4")
nativeQuery.executeUpdate();

डेटाबेससाठी मूळ SQL क्वेरी कार्यान्वित केली गेली आहे. याचा अर्थ डेटाबेसमध्ये काहीतरी बदलले आहे - विनंती executeUpdate() पद्धतीने कॉल केली गेली होती . म्हणून, या प्रकरणात, हायबरनेट ते सुरक्षितपणे प्ले करेल आणि त्याच्या कॅशेमधून सर्व प्रकारच्या सर्व वस्तू काढून टाकेल .

तुम्हाला ते कसे आवडते? तुम्ही निरुपद्रवी विनंती कॉल करता आणि प्रतिसादात हायबरनेट कॅशेमधील सर्व डेटा मिटवते! जर त्याने पायापेक्षा वेगळ्या वस्तू ठेवल्या तर त्यापेक्षा हे नक्कीच चांगले आहे, पण तेच!

म्हणून, हायबरनेटच्या निर्मात्यांनी या प्रकरणात हायबरनेटला कशी मदत करावी हे त्वरीत शोधून काढले. कॅशेमधून कोणता प्रकार काढायचा ते तुम्ही सांगू शकता:

Query nativeQuery = session.createNativeQuery("update employee set name=’Alex’ where id = 4");
nativeQuery.unwrap(org.hibernate.SQLQuery.class).addSynchronizedEntityClass(Employee.class);
nativeQuery.executeUpdate();
टिप्पणी . मूळ निवडक क्वेरी कॅशे फ्लश करत नाहीत , फक्त घाला, अपडेट करा, हटवा, प्रक्रिया कॉल इ.

मॅन्युअल कॅशे साफ करणे

काही कारणांमुळे, तुम्ही स्वतः कॅशेमधून एखादी वस्तू हटवू शकता. हे वेगवेगळ्या प्रकारे केले जाऊ शकते.

लक्षात ठेवा . कॅशेमधील ऑब्जेक्ट्स प्रदेश म्हणतात गटांमध्ये संग्रहित केल्या जातात . डीफॉल्टनुसार, प्रदेशाचे नाव वर्गाच्या नावासारखेच असते. म्हणून, जर तुमच्याकडे com.codegym.employee प्रकारातील वस्तू असतील , तर त्या सर्व “ com.codegym.employee ” नावाच्या गटात (प्रदेशात) संग्रहित केल्या जातील .

जर तुम्हाला कॅशेमध्ये प्रवेश करायचा असेल आणि त्यासह काहीतरी करायचे असेल, तर तुम्ही ते SessionFactory ऑब्जेक्ट आणि getCache () पद्धतीने करू शकता :

session.getSessionFactory().getCache().evictQueryRegion("com.codegym.employee”);

तुम्हाला सर्व गटांमधून (प्रदेश) डेटा हटवायचा असल्यास, तुम्हाला खालील क्वेरी चालवावी लागेल:

session.getSessionFactory().getCache().evictAllRegions();

कॅशेमधून एक ऑब्जेक्ट काढण्यासाठी, तुम्हाला त्याचे नाव (प्रकार) आणि आयडी पास करणे आवश्यक आहे. आपण हे दोन प्रकारे करू शकता:

session.getSessionFactory().getCache().evictEntityData("Employee, 4);

session.getSessionFactory().getCache().evictEntityData(com.codegym.Employee.class, 4);

एखादी विशिष्ट वस्तू कॅशेमध्ये आहे का ते देखील तुम्ही तपासू शकता:

session.getSessionFactory().getCache().containsEntity("Employee, 4);
session.getSessionFactory().getCache().containsEntity(com.codegym.Employee.class, 4);