2012-10-22 13 views
6

मुझे हाइबरनेट द्वितीय स्तर के कैश के साथ कुछ स्पष्टीकरण की आवश्यकता है।हाइबरनेट द्वितीय स्तर कैश पर स्पष्टता की आवश्यकता

  1. हाइबरनेट द्वितीय स्तर कैश कैसे काम करता है?

  2. क्या यह उन तालिकाओं से सभी डेटा लोड करता है जिनके लिए जावा ईई पर्यावरण में सर्वर पर इकाई वर्गों में इकाई वर्गों में @ कैशेबल एनोटेशन (हाइबरनेट एनोटेशन के संबंध में) है?

  3. क्या उन तालिकाओं पर अद्यतन होने पर कैश सिंक हो जाएगा और कैसे?

  4. आखिरी बार मेरे डीएओ कोड को अधिसूचित करने के लिए कोई तरीका है जब किसी तालिका पर अपडेट किया गया है, जिस पर मुझे रूचि है? (किसी भी श्रोता की तलाश में जो टेबल के अपडेट को अंतर कर सकता है)।

उत्तर

0
  1. एक बहुत व्यापक सवाल है कि यहाँ उत्तर दिया जाना है।

  2. नहीं। यह कैश को आलसी रूप से पॉप्युलेट करता है। प्रत्येक बार जब आप हाइबरनेट एपीआई या क्वेरी का उपयोग करते हुए डेटाबेस से एक कैच करने योग्य इकाई प्राप्त करते हैं, तो यह इकाई कैश में संग्रहीत होती है। बाद में, जब session.get() को कैश में मौजूद किसी इकाई की आईडी के साथ बुलाया जाता है, तो कोई डेटाबेस क्वेरी आवश्यक नहीं होती है।

  3. यदि अद्यतन हाइबरनेट के माध्यम से किया जाता है, तो कैश अपडेट किया जाता है। यदि यह किसी बाहरी एप्लिकेशन, या SQL क्वेरी, या यहां तक ​​कि एक थोक अद्यतन HQL क्वेरी का उपयोग करके किया जाता है, तो कैश अद्यतन से अनजान है। यही कारण है कि आपको सावधान रहना होगा कि आप कौन सी संस्थाओं को कैच करने योग्य बनाते हैं, जो आप चुनने के लिए समय-समय पर रहते हैं, आदि। कभी-कभी, पुराने मूल्यों को वापस करना समस्याग्रस्त नहीं होता है, और कभी-कभी यह अस्वीकार्य है।

  4. सं

+0

आपके उत्तर के लिए धन्यवाद। केवल जब मैं दूसरी बार आईडी द्वारा क्वेरी करता हूं तो यह डेटाबेस के बजाय कैश से डेटा प्राप्त करने का प्रयास करता है? मैं cfg.xml फ़ाइल में "Show_SQL = true" के साथ अपने एप्लिकेशन में दूसरे स्तर के कैश का उपयोग कर रहा हूं, जब भी मैं एक ही विधि को कई बार कॉल करता हूं तो क्वेरी प्रिंट करता है। क्या इसका मतलब यह है कि यह सिर्फ कंसोल पर क्वेरी प्रिंट करता है, लेकिन यह डेटा कैश से प्राप्त करता है? क्या डेटा को लाया जाता है (चाहे डीबी या कैश से) सत्यापित करने या जांचने के लिए वैसे भी है? –

+0

हां, कैश का उपयोग केवल आईडी द्वारा इकाइयों तक पहुंचने के दौरान किया जाता है ('session.get() 'के साथ या एक सेऑन एसोसिएशन के माध्यम से नेविगेट करके) –

2
  1. कैसे हाइबरनेट दूसरे स्तर कैश काम करता है?

    जब आपकी इकाई को कैश करने योग्य के रूप में चिह्नित किया जाता है और यदि आपने दूसरे स्तर के कैश को कॉन्फ़िगर किया है तो हाइबरनेट पहले पढ़ने के बाद इकाई को दूसरे स्तर के कैश में कैश करेगा।

    हाइबरनेट किसी भी कैश कार्यान्वयन को प्लगइन करने के लिए लचीलापन प्रदान करता है जो हाइबरनेट विनिर्देशों का पालन करता है। दूसरे स्तर के कैश और कॉन्फ़िगरेशन विकल्पों पर अधिक जानकारी के लिए Hibernate Manual देखें।

  2. क्या यह उन तालिकाओं से सभी डेटा लोड करता है जिनके लिए जावा ईई पर्यावरण में सर्वर पर इकाई वर्गों में इकाई वर्गों में @ कैशेबल एनोटेशन (हाइबरनेट एनोटेशन के संबंध में) है?

    मुझे नहीं लगता कि यह प्राप्त करने के लिए कोई विन्यास है। अप्रत्यक्ष रूप से आप स्टार्टअप में पूरी तालिका को पढ़कर इसे प्राप्त कर सकते हैं, यह सिस्टम स्टार्टअप समय पर प्रतिकूल प्रभाव डाल सकता है। (मुझे यह पसंद नहीं है)। अगर इकाई को बाहरी रूप से संशोधित किया गया है, तो हाइबरनेट इसे सिंक नहीं कर सकता है और आप पुराने डेटा प्राप्त कर लेंगे।

  3. क्या उन तालिकाओं पर अद्यतन होने पर कैश सिंक हो जाएगा और कैसे?

    कैश तालिका अद्यतन के तुरंत बाद अद्यतन नहीं किया जाएगा। अद्यतन रिकॉर्ड लाने के लिए बाद की कॉल डेटाबेस पर जाएगी, हाइबरनेट सत्र टाइमस्टैम्प का उपयोग कर आंतरिक रूप से इसे प्राप्त करता है।

  4. आखिरी बार मेरे डीएओ कोड को अधिसूचित करने के लिए कोई तरीका है जब किसी तालिका पर अपडेट किया गया है, जिस पर मुझे रूचि है? (किसी भी श्रोता की तलाश में जो टेबल के अपडेट को अंतर कर सकता है)।

    नहीं, हाइबरनेट इसका समर्थन नहीं करता है।

+0

विस्तृत उत्तर के लिए धन्यवाद। तो तालिका से अद्यतन डेटा पढ़ने के लिए कभी भी एक स्पष्ट कैल होना चाहिए और आंतरिक रूप से कैश को आंतरिक रूप से अद्यतन करना चाहिए? मैं cfg.xml फ़ाइल में "Show_SQL = true" के साथ अपने एप्लिकेशन में दूसरे स्तर के कैश का उपयोग कर रहा हूं, जब भी मैं एक ही विधि को कई बार कॉल करता हूं तो क्वेरी प्रिंट करता है। क्या इसका मतलब यह है कि यह सिर्फ कंसोल पर क्वेरी प्रिंट करता है, लेकिन यह डेटा कैश से प्राप्त करता है? क्या डेटा को लाया जाता है (चाहे डीबी या कैश से) सत्यापित करने या जांचने के लिए वैसे भी है? –

+0

यदि यह SQL प्रदर्शित करता है, तो यह इसे निष्पादित कर रहा है। यदि आप कोई क्वेरी निष्पादित कर रहे हैं, और केवल 'सत्र.get() 'को कॉल नहीं करते हैं या किसी एक संगठन को नेविगेट नहीं करते हैं, तो यह हमेशा एक SQL क्वेरी निष्पादित करेगा, जब तक कि क्वेरी स्वयं कैच करने योग्य न हो और क्वेरी कैश सक्षम हो। –

+0

मैंने अपने एप्लिकेशन में क्वेरी कैश को सक्षम नहीं किया है और मैं ज्यादातर एचक्यूएल क्वेरी का उपयोग कर रहा हूं। जब भी मैं एक ही विधि में कॉल करता हूं तो यह क्वेरी निष्पादित करता है - इसका मतलब यह है कि हर बार यह डेटा r8t प्राप्त करने के लिए डेटाबेस को हिट करता है? लेकिन जब मैं हर पुनरावृत्ति पर लिया गया समय प्रिंट करता हूं तो यह घटता रहता है। यही कारण है कि मैं भ्रमित हो रहा हूं कि डेटा डीबी या कैश से खींचा गया है –

संबंधित मुद्दे