हाइबरनेट द्वितीय स्तर कैश का उपयोग कब और कैसे करें?


90

मुझे समझने में परेशानी होती है कि हाइबरनेट दूसरे स्तर के कैश को कब हिट करता है और कब कैश को अमान्य करता है।

यह वही है जो मैं वर्तमान में समझता हूं:

  • दूसरा स्तर कैश सत्र के बीच संस्थाओं को संग्रहीत करता है, स्कोप सत्र है
  • आपको यह बताना होगा कि किन संस्थाओं को कैश करना है, कोई भी संस्था डिफ़ॉल्ट रूप से कैश नहीं होगी
  • क्वेरी कैश कैश में क्वेरीज़ का परिणाम संग्रहीत करता है।

जो मुझे समझ नहीं आ रहा है

  • हाइबरनेट कब इस कैश को हिट करता है?
  • मान लीजिए कि मैंने दूसरा स्तर कैश स्थापित किया है, लेकिन क्वेरी कैशिंग नहीं। मैं अपने ग्राहकों को कैश करना चाहता हूं, उनमें से 50000 हैं। मैं किन तरीकों से ग्राहकों को कैश से पुनर्प्राप्त कर सकता हूं?
  • मुझे लगता है कि मैं उन्हें कैश से आईडी द्वारा प्राप्त कर सकता हूं। यह आसान होगा लेकिन कैशिंग के लायक भी नहीं। लेकिन क्या होगा अगर मैं अपने सभी ग्राहकों के साथ कुछ गणना करना चाहता हूं। मान लीजिए कि मैं ग्राहकों की सूची दिखाना चाहता हूं तो मैं उन्हें कैसे एक्सेस करूंगा?
  • यदि क्वेरी कैशिंग अक्षम है तो मुझे अपने सभी ग्राहक कैसे मिलेंगे?
  • अगर किसी ने ग्राहकों को अपडेट किया तो क्या होगा?
    • क्या वह ग्राहक कैश में अमान्य हो जाएगा या सभी ग्राहक अमान्य हो जाएंगे?

या मैं कैशिंग पूरी तरह से गलत सोच रहा हूं? उस स्थिति में दूसरे स्तर के कैश का अधिक उपयुक्त उपयोग क्या होगा? हाइबरनेट प्रलेखन बिल्कुल स्पष्ट नहीं है कि कैश वास्तविकता में कैसे काम करता है। इसे स्थापित करने के तरीके के बारे में केवल निर्देश हैं।

अपडेट: तो मुझे समझ में आ गया है कि आईडी द्वारा डेटा लोड करने के लिए द्वितीय स्तर कैश (क्वेरी कैश के बिना) अच्छा होगा। उदाहरण के लिए मेरे पास उपयोगकर्ता ऑब्जेक्ट है जिसे मैं एक वेब एप्लिकेशन में हर अनुरोध में अनुमतियों के लिए जांचना चाहता हूं। क्या दूसरे स्तर के कैश में उपयोगकर्ता को कैशिंग करके डेटाबेस एक्सेस को कम करना एक अच्छा मामला होगा? जैसे मैं यूजर आईडी को सत्र में या जहाँ भी और जब मुझे अनुमति के लिए जाँच करने की आवश्यकता होगी, तो मैं उपयोगकर्ता को आईडी और चेक अनुमतियाँ लोड करूँगा।


जवाबों:


100

सबसे पहले, चलो प्रक्रिया स्तर कैश (या दूसरे स्तर के कैश के बारे में बात करते हैं क्योंकि वे इसे हाइबरनेट में कहते हैं)। इसे काम करने के लिए, आपको करना चाहिए

  1. कैश प्रदाता कॉन्फ़िगर करें
  2. बताएं कि कैश करने के लिए कौन सी इकाइयां हैं (यदि आप इस तरह की मैपिंग का उपयोग करते हैं तो hbm.xml फ़ाइल में सही है)।

आप कैश प्रदाता को बताएं कि उसे कितनी वस्तुओं को स्टोर करना चाहिए और कब / क्यों उन्हें अमान्य किया जाना चाहिए। तो मान लें कि आपके पास बुक और ऑथर इकाइयाँ हैं, हर बार जब आप उन्हें डीबी से प्राप्त कर रहे हैं, केवल वे जो कैश में नहीं हैं, उन्हें वास्तव में डीबी से चुना जाएगा। इससे प्रदर्शन में काफी वृद्धि होती है। यह उपयोगी है जब:

  • आप केवल हाइबरनेट के माध्यम से डेटाबेस को लिखते हैं (क्योंकि यह जानना चाहिए कि कैश में संस्थाओं को कब बदलना या अमान्य करना है)
  • आप अक्सर वस्तुओं को पढ़ते हैं
  • आपके पास एक नोड है, और आपके पास प्रतिकृति नहीं है। अन्यथा आपको स्वयं कैश को दोहराने की आवश्यकता होगी (JGroups जैसे वितरित कैश का उपयोग करें) जो अधिक जटिलता जोड़ता है, और यह शेयर-नथिंग ऐप के रूप में अच्छा नहीं है।

तो कैश कब काम करता है?

  • जब आप session.get()या session.load()ऑब्जेक्ट जो पहले चुने गए थे और कैश में रहते हैं। कैश एक स्टोरेज है जहां आईडी की कुंजी है और गुण मान हैं। इसलिए केवल जब आईडी द्वारा खोज करने की संभावना है तो आप डीबी को रोक सकते हैं।
  • जब आपके संगठन आलसी-लोडेड होते हैं (या जॉन्स के बजाय चयनों के साथ उत्सुक-लोड होते हैं)

लेकिन यह तब काम नहीं करता है जब:

  • यदि आप आईडी द्वारा चयन नहीं करते हैं। फिर से - दूसरा स्तर कैश अन्य गुणों के लिए संस्थाओं के आईडी का एक नक्शा संग्रहीत करता है (यह वास्तव में वस्तुओं को संग्रहीत नहीं करता है, लेकिन डेटा स्वयं), इसलिए यदि आपका लुकअप इस तरह दिखता है: from Authors where name = :nameतो आप कैश को हिट नहीं करते हैं।
  • जब आप HQL का उपयोग करते हैं (भले ही आप उपयोग करें where id = ?)।
  • यदि आपकी मैपिंग आपके द्वारा सेट की जाती है fetch="join", तो इसका मतलब है कि अलग-अलग चुनिंदा कथनों के बजाय संघों को लोड करने के लिए हर जगह उपयोग किया जाएगा। प्रक्रिया स्तर कैश बच्चों की वस्तुओं पर तभी काम करता है जब fetch="select"उसका उपयोग किया जाता है।
  • यहां तक ​​कि अगर आपके पास है, fetch="select"लेकिन फिर एचक्यूएल में आप संघों का चयन करने के लिए जॉइन का उपयोग करते हैं - तो उन जॉन्स को तुरंत जारी किया जाएगा और वे आपके द्वारा hbm.xml या एनोटेशन में निर्दिष्ट किए गए को अधिलेखित कर देंगे।

अब, क्वेरी कैश के बारे में। आपको ध्यान देना चाहिए कि यह एक अलग कैश नहीं है, यह प्रक्रिया स्तर कैश के अतिरिक्त है। मान लीजिए कि आपकी एक देश इकाई है। यह स्थिर है, इसलिए आप जानते हैं कि हर बार जब आप कहते हैं तो एक ही परिणाम सेट किया जाएगा from Country। यह क्वेरी कैश के लिए एक आदर्श उम्मीदवार है, यह अपने आप में आईडी की एक सूची संग्रहीत करेगा और जब आप अगली बार सभी देशों का चयन करेंगे, तो यह सूची को प्रक्रिया स्तर कैश पर लौटा देगा और बाद में, प्रत्येक आईडी के लिए ऑब्जेक्ट वापस कर देगा। के रूप में इन वस्तुओं पहले से ही 2 स्तर कैश में जमा हो जाती है। इकाई परिवर्तन से संबंधित प्रत्येक बार क्वेरी कैश को अमान्य कर दिया जाता है। तो मान लीजिए कि आपको from Authorsएक क्वेरी कैश में कॉन्फ़िगर किया गया है। यह प्रभावी नहीं होगा क्योंकि लेखक अक्सर बदलता है।


क्या क्वेरी "लेखक से एक भ्रूण शामिल है a .books" को कैश से लेखकों को लाने के लिए क्वेरी कैश की आवश्यकता होती है?
palto

1
नहीं, क्वेरी कैश केवल स्थिर डेटा के लिए है और यह केवल आईडी संग्रहीत करता है। लेखकों को द्वितीय स्तर के कैश से लिया जाएगा।
स्टैनिस्लाव बश्किर्त्सेव

@ctapobep: सच नहीं, तुम क्या कहते हो! "लेखक से एक भ्रूण जुड़ना a.books" ठीक काम करता है यदि इकाई के क्षेत्र की किताबें लेखक को एनोटेट किया जाता है (ईएजीईआरईआर) ... मुझे लगता है कि बहुत देर हो चुकी है
बिलाल बीबीबी

इतना बढ़िया जवाब! मैं इसे हर समय याद रखूंगा! : d
मोहम्मदरेज़ा खातमी

'क्वेरी कैश' को सक्षम करने के बाद, क्या यह आईडी से अन्य संपत्ति द्वारा चयन करने पर कैश से डेटा प्राप्त करता है?
अरुण राज

41
  • दूसरा स्तर कैश की-वैल्यू स्टोर है। यह केवल तभी काम करता है जब आप आईडी द्वारा अपनी इकाइयां प्राप्त करते हैं
  • जब कोई इकाई हाइबरनेट के माध्यम से अपडेट / डिलीट हो जाती है, तो 2 लेवल कैश को प्रति यूनिट अमान्य / अपडेट किया जाता है। यदि डेटाबेस को अलग तरीके से अपडेट किया जाता है तो यह अमान्य नहीं है।
  • क्वेरी के लिए (जैसे ग्राहकों की सूची) क्वेरी कैश का उपयोग करें।

वास्तव में यह महत्वपूर्ण है कि एक मूल्य-मूल्य वितरित कैश होना चाहिए - यही वह है जो मेमेकटेड है, और यह फेसबुक, ट्विटर और कई और अधिक अधिकार देता है। लेकिन अगर आपके पास आईडी द्वारा लुकअप नहीं है, तो यह बहुत उपयोगी नहीं होगा।


12

पार्टी के लिए देर से लेकिन इन सवालों के व्यवस्थित उत्तर देना चाहते थे जो कई डेवलपर्स पूछते हैं।

आपके प्रश्न को एक-एक करके यहाँ ले जाना मेरा उत्तर है।

Q. हाइबरनेट कब इस कैश को हिट करता है?

A. फर्स्ट लेवल कैश के साथ जुड़ा हुआ है सेशन ऑब्जेक्टदूसरा स्तर कैश साथ जुड़ा हुआ है सत्र फैक्टरी वस्तु । यदि ऑब्जेक्ट पहले में नहीं मिलता है, तो दूसरे स्तर की जांच की जाती है।

प्र। मान लें कि मैंने दूसरे स्तर का कैश सेट किया है, लेकिन क्वेरी कैशिंग नहीं। मैं अपने ग्राहकों को कैश करना चाहता हूं, उनमें से 50000 हैं। मैं किन तरीकों से ग्राहकों को कैश से पुनर्प्राप्त कर सकता हूं?

उ। आपके अपडेट में आपको वह उत्तर मिला है। इसके अलावा क्वेरी कैश केवल ऑब्जेक्ट की आईडी की सूची को संग्रहीत करता है और जो ऑब्जेक्ट अपनी आईडी को लिखते हैं वे उसी दूसरे स्तर के कैश में संग्रहीत होते हैं । इसलिए यदि आप क्वेरी कैश सक्षम करते हैं, तो आप उसी संसाधन का उपयोग करेंगे। सही है?

Q. मुझे लगता है कि मैं उन्हें कैश से आईडी द्वारा प्राप्त कर सकता हूं। यह आसान होगा लेकिन कैशिंग के लायक भी नहीं। लेकिन क्या होगा अगर मैं अपने सभी ग्राहकों के साथ कुछ गणना करना चाहता हूं। मान लीजिए कि मैं ग्राहकों की सूची दिखाना चाहता हूं तो मैं उन्हें कैसे एक्सेस करूंगा?

उ। उत्तर दिया।

यदि प्रश्न कैशिंग अक्षम है तो मुझे अपने सभी ग्राहक कैसे मिलेंगे?

उ। उत्तर दिया।

Q. अगर किसी ने ग्राहकों को अपडेट किया तो क्या होगा? क्या वह ग्राहक कैश में अमान्य हो जाएगा या सभी ग्राहक अमान्य हो जाएंगे?

ए। हाइबरनेट का कोई पता नहीं है, लेकिन आप दूसरे स्तर के आईएमडीजी / वितरित कैश का उपयोग कर सकते हैं ताकि उन्हें हाइबरनेट दूसरे स्तर के कैश के रूप में लागू किया जा सके और उन्हें अमान्य कर दिया जा सके। उदाहरण के लिए, टिज़ग्रिड एक ऐसा उत्पाद है और मेरे अनुमान से अधिक हैं।


0

हाइबरनेट दूसरे स्तर के कैश को समझने और लागू करने के लिए थोड़ा मुश्किल है। यहां हम आपके सवालों के आधार पर कह सकते हैं:

हाइबरनेट ने इस कैश को कब मारा?

जैसा कि आप सुझाव देते हैं, हाइबरनेट L2 कैश (यदि सक्षम है, तो यह डिफ़ॉल्ट रूप से चालू नहीं है) L1 कैश के बाद ही क्वेरी की जाती है। यह एक कुंजी-मूल्य कैश है जिसका डेटा कई सत्रों में संरक्षित है।

मान लीजिए कि मैंने दूसरा स्तर कैश स्थापित किया है, लेकिन क्वेरी कैशिंग नहीं। मैं अपने ग्राहकों को कैश करना चाहता हूं, उनमें से 50000 हैं। मैं किन तरीकों से ग्राहकों को कैश से पुनर्प्राप्त कर सकता हूं?

इस उपयोग के मामले के लिए क्वेरी कैशिंग सबसे अच्छा होगा, क्योंकि ग्राहक डेटा स्थिर है और एक रिलेशनल डेटाबेस से प्राप्त किया गया है।

अगर किसी ने ग्राहकों को अपडेट किया तो क्या होगा? क्या वह ग्राहक कैश में अमान्य हो जाएगा या सभी ग्राहक अमान्य हो जाएंगे?

यह विशिष्ट हाइबरनेट कैश रणनीति पर निर्भर करता है जिसका आप उपयोग कर रहे हैं। हाइबरनेट की वास्तव में चार अलग-अलग कैश रणनीतियाँ हैं:

READ_ONLY : कैश के अंदर एक बार ऑब्जेक्ट नहीं बदलते हैं।

NONSTRICT_READ_WRITE : इसी डेटाबेस प्रविष्टि के अपडेट होने के बाद ऑब्जेक्ट बदल जाते हैं (अंततः); यह अंतिम स्थिरता की गारंटी देता है।

पढ़ना लिखना : संबंधित डेटाबेस प्रविष्टि के अपडेट होने के बाद ऑब्जेक्ट बदलते हैं (तुरंत); यह "सॉफ्ट" ताले का उपयोग करके मजबूत स्थिरता की गारंटी देता है।

लेन-देन संबंधी : वस्तुएं वितरित XA लेनदेन का उपयोग करके, डेटा अखंडता को सुनिश्चित करती हैं; यह या तो कुल सफलता की गारंटी देता है या सभी परिवर्तनों को वापस करता है। इन चार मामलों में, हालांकि, एकल डेटाबेस प्रविष्टि को अपडेट करने से कैश में ग्राहकों की पूरी सूची अमान्य नहीं होगी। हाइबरनेट उस से थोड़ा चालाक है :)

हाइबरनेट में L2 कैशिंग कैसे काम करता है, इसके बारे में अधिक जानने के लिए, आप लेख "हाइबरनेट L2 कैश क्या है" या रेडिस के साथ हाइबरनेट में गहन लेख कैशिंग कर सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.