मैं हाइबरनेट के माध्यमिक स्तर के कैश के बारे में कुछ बिंदुओं को स्पष्ट करना चाहूंगा। स्पष्ट करने के लिए बिंदु है, क्या HQL प्रश्न हमेशा डेटाबेस को हिट करेगा (कम से कम आईडी प्राप्त करने के लिए)।
गौर कीजिए कि हमारे पास संस्थाएँ हैं
class Customer {
long id; // Primary key
String name;
set <Address> addressList; // One to many relationship
}
class Address{
long id; // Primary key
String houseName;
}
पते के लिए डेटाबेस तालिका में ग्राहक (आईडी) के लिए एक विदेशी कुंजी संदर्भ है जो एक से कई संबंधों का समर्थन करता है।
एक पूर्व शर्त के रूप में, मैंने EHcache के रूप में हाइबरनेट के लिए स्तर 2 कैश को सक्षम किया है। केवल इकाई और संघों को सेट करने योग्य है। क्वेरी कैशिंग सक्षम नहीं है।
मुझे पता है कि अगर मैं एक से अधिक बार session.get () या session.load () का उपयोग करता हूं, तो केवल पहली कॉल डेटाबेस में एक क्वेरी को आग लगा देगी और बाद में लेवल 2 कैश से डेटा लेगी।
मेरे प्रश्न हैं
1) क्या HQL दूसरे स्तर के कैश का लाभ उठाएगा। एक सत्र में मैंने ग्राहक कुंजी से c.id =? ") .SetParameter (1, 1005) का उपयोग करते हुए प्राथमिक कुंजी (आईडी) का उपयोग करके ऑब्जेक्ट प्राप्त करने के लिए एक HQL को निष्पादित किया।
अगर मैं एक ही HQL को एक अलग सत्र में चलाता हूं, तो क्या ग्राहक ऑब्जेक्ट को स्तर 2 कैश से लिया जाएगा या यह डेटाबेस को फिर से हिट करेगा।
2) निष्पादित एक और HQL पर विचार करें from Customer as c left join fetch c.addressList
ग्राहक और संबंधित पते का चयन करने के लिए।
अगर मैं एक ही HQL को एक अलग सत्र में चलाता हूं, तो संबंधित पते को स्तर 2 कैश से लिया जाएगा या यह डेटाबेस को फिर से हिट करेगा।
उत्तर:
उत्तर № 1 के लिए 4क्योंकि आपने "क्वेरी कैश को सक्षम नहीं किया है, इसलिए कोई भी इकाई क्वेरी द्वितीय स्तर के कैश से नहीं टकराएगी। इसलिए, दोनों क्वेरीज़ DB के विरुद्ध चलती हैं।
आप क्वेरी कैश को सक्षम कर सकते हैं यदि आप चाहते हैं कि प्रश्न 2 के स्थान पर कैश का उपयोग करें। चेक आउट यह लेख इस विषय के बारे में अधिक जानकारी के लिए।