जवाबों:
1.1) प्रथम-स्तरीय कैश
प्रथम-स्तरीय कैश हमेशा सत्र ऑब्जेक्ट के साथ संबद्ध होता है । हाइबरनेट डिफ़ॉल्ट रूप से इस कैश का उपयोग करता है। यहां, यह एक के बाद एक लेनदेन की प्रक्रिया करता है, इसका मतलब है कि एक लेनदेन को कई बार संसाधित करना नहीं है। मुख्य रूप से यह एसक्यूएल प्रश्नों की संख्या को कम करता है, जो किसी दिए गए लेनदेन के भीतर उत्पन्न करने की आवश्यकता होती है। यह लेन-देन में किए गए प्रत्येक संशोधन के बाद अद्यतन करने के बजाय, यह लेन-देन के अंत में ही लेनदेन को अद्यतन करता है।
1.2) दूसरे स्तर का कैश
सेकंड-लेवल कैश हमेशा सेशन फैक्ट्री ऑब्जेक्ट के साथ जुड़ता है । लेन-देन को चलाने के दौरान, इसके बीच में सेशन फ़ैक्टरी स्तर पर ऑब्जेक्ट्स को लोड किया जाता है, ताकि वे ऑब्जेक्ट पूरे एप्लिकेशन के लिए उपलब्ध हों, एकल उपयोगकर्ता के लिए बाध्य न हों। चूँकि ऑब्जेक्ट पहले से कैश में लोड होते हैं, जब भी कोई ऑब्जेक्ट क्वेरी द्वारा वापस किया जाता है, उस समय डेटाबेस लेनदेन के लिए जाने की कोई आवश्यकता नहीं होती है। इस तरह से दूसरे स्तर का कैश काम करता है। यहाँ हम क्वेरी स्तर कैश का उपयोग कर सकते हैं।
से उद्धृत: http://javabeat.net/introduction-to-hibernate-caching/
स्ट्रीमलाइन लॉजिक ब्लॉग पर पहले स्तर के कैशिंग की बहुत अच्छी व्याख्या है ।
मूल रूप से, प्रथम स्तर की कैशिंग प्रति सत्र के आधार पर होती है, जहाँ दूसरे स्तर की कैचिंग को कई सत्रों में साझा किया जा सकता है।
यहाँ हाइबरनेट कैश की कुछ बुनियादी व्याख्या ...
प्रथम स्तर का कैश "सत्र" ऑब्जेक्ट के साथ जुड़ा हुआ है। कैश ऑब्जेक्ट्स का दायरा सत्र का है। एक बार सत्र बंद हो जाने पर, कैश्ड वस्तुएं हमेशा के लिए चली जाती हैं। प्रथम स्तर कैश डिफ़ॉल्ट रूप से सक्षम है और आप इसे अक्षम नहीं कर सकते। जब हम किसी इकाई को पहली बार क्वेरी करते हैं, तो इसे डेटाबेस से पुनर्प्राप्त किया जाता है और हाइबरनेट सत्र से जुड़े पहले स्तर के कैश में संग्रहीत किया जाता है। यदि हम समान सत्र वस्तु के साथ उसी ऑब्जेक्ट को फिर से क्वेरी करते हैं, तो इसे कैश से लोड किया जाएगा और कोई sql क्वेरी निष्पादित नहीं की जाएगी। भरी हुई इकाई को evict()
विधि का उपयोग करके सत्र से हटाया जा सकता है । यदि इस evict()
विधि का उपयोग करके इसे हटा दिया गया है, तो इस इकाई का अगला लोडिंग फिर से एक डेटाबेस कॉल करेगा । पूरे सत्र कैश को clear()
विधि का उपयोग करके हटाया जा सकता है । यह कैश में संग्रहीत सभी संस्थाओं को हटा देगा।
दूसरा स्तर कैश प्रथम स्तर के कैश के अलावा है जो सत्र कारखाना क्षेत्र में वैश्विक स्तर पर उपयोग करने के लिए उपलब्ध है। सेकंड लेवल कैश को सेशन फैक्ट्री स्कोप में बनाया गया है और यह सभी सेशन में इस्तेमाल होने के लिए उपलब्ध है जो उस सेशन फैक्ट्री का उपयोग करके बनाए गए हैं। इसका अर्थ यह भी है कि एक बार सत्र कारखाना बंद हो जाने पर, इससे जुड़े सभी कैश मर जाते हैं और कैश मैनेजर भी बंद हो जाता है। जब भी हाइबरनेट सत्र एक इकाई को लोड करने का प्रयास करता है, तो पहले स्तर कैश में इकाई की कैश्ड प्रति (विशेष हाइबरनेट सत्र के साथ संबद्ध) के लिए यह बहुत पहले स्थान पर दिखता है। यदि इकाई की कैश्ड प्रति पहले स्तर के कैश में मौजूद है, तो इसे लोड विधि के परिणाम के रूप में लौटाया जाता है। यदि पहले स्तर के कैश में कैश की गई इकाई नहीं है, तो कैशेड इकाई के लिए दूसरे स्तर के कैश को देखा जाता है। यदि दूसरे स्तर के कैश में कैश्ड इकाई है, तो इसे लोड विधि के परिणाम के रूप में लौटाया जाता है। परंतु, इकाई को वापस करने से पहले, इसे पहले स्तर के कैश में भी संग्रहीत किया जाता है ताकि इकाई के लिए लोड करने की विधि के लिए अगला आह्वान इकाई को पहले स्तर के कैश से वापस कर देगा, और फिर से दूसरे स्तर के कैश में जाने की आवश्यकता नहीं होगी। यदि इकाई पहले स्तर के कैश और दूसरे स्तर के कैश में भी नहीं मिलती है, तो डेटाबेस क्वेरी निष्पादित की जाती है और प्रतिक्रिया के रूप में लौटने से पहले दोनों कैश स्तरों में इकाई को संग्रहीत किया जाता है।load()
तरीका।
यह एक बहुत ही सामान्य प्रश्न है, इसलिए यह उत्तर मेरे ब्लॉग पर लिखे गए इस लेख पर आधारित है ।
हाइबरनेट अंतिम संभव क्षण तक दृढ़ता फ्लशिंग को स्थगित करने की कोशिश करता है। जैसा कि मैंने इस लेख में बताया है , इस रणनीति को पारंपरिक रूप से ट्रांसेक्शनल राइट-बैक के रूप में जाना जाता है।
राइट-बैक किसी भी तार्किक या भौतिक लेनदेन के बजाय हाइबरनेट फ्लशिंग से संबंधित है। लेन-देन के दौरान, फ़्लश कई बार हो सकता है।
फ्लश किए गए परिवर्तन केवल वर्तमान डेटाबेस लेनदेन के लिए दिखाई देते हैं। जब तक वर्तमान लेनदेन नहीं किया जाता है, तब तक कोई परिवर्तन अन्य समवर्ती लेनदेन द्वारा दिखाई नहीं देता है।
प्रथम-स्तरीय कैश के कारण, हाइबरनेट कई अनुकूलन कर सकता है:
एक उचित कैशिंग समाधान को कई हाइबरनेट सत्रों में फैलाना होगा और यही कारण है कि हाइबरनेट अतिरिक्त द्वितीय-स्तरीय कैश का भी समर्थन करता है।
दूसरे स्तर का कैश सेशनफैक्टरी जीवन-चक्र के लिए बाध्य है, इसलिए इसे केवल SessionFactory
बंद होने पर नष्ट कर दिया जाता है (आमतौर पर जब एप्लिकेशन बंद हो रहा होता है)। दूसरे स्तर का कैश मुख्य रूप से इकाई आधारित है, हालांकि यह वैकल्पिक क्वेरी-कैशिंग समाधान का भी समर्थन करता है।
अधिक जानकारी के लिए, इस लेख को देखें ।
डिफ़ॉल्ट रूप से, NHibernate प्रथम स्तर की कैशिंग का उपयोग करता है जो सत्र वस्तु आधारित है। लेकिन अगर आप एक बहु-सर्वर वातावरण में चल रहे हैं, तो पहले स्तर का कैश कुछ प्रदर्शन मुद्दों के साथ बहुत स्केलेबल नहीं हो सकता है। यह इस तथ्य के कारण होता है कि इसे डेटाबेस में बहुत बार यात्राएं करनी पड़ती हैं क्योंकि डेटा कई सर्वरों पर वितरित किया जाता है। दूसरे शब्दों में, NHibernate बॉक्स से बाहर एक बुनियादी, गैर-परिष्कृत-इन-प्रोसेस L1 कैश प्रदान करता है। हालाँकि, यह ऐसी सुविधाएँ प्रदान नहीं करता है कि एक कैशिंग समाधान का अनुप्रयोग प्रदर्शन पर एक उल्लेखनीय प्रभाव होना चाहिए।
इसलिए इन सभी समस्याओं का प्रश्न L2 कैश का उपयोग है जो सत्र फैक्ट्री ऑब्जेक्ट्स के साथ जुड़ा हुआ है। यह डेटाबेस में समय लेने वाली यात्राओं को कम कर देता है इसलिए अंततः ऐप प्रतिक्रिया समय बढ़ाता है।
पहले स्तर का कैश
सत्र वस्तु पहले स्तर के कैश डेटा को रखती है। इसे बाई दिफ़ौल्ट मर्थकृत किया गया है। प्रथम स्तर का कैश डेटा पूरे आवेदन के लिए उपलब्ध नहीं होगा। एक आवेदन कई सत्र वस्तु का उपयोग कर सकता है।
दूसरा स्तर कैश
SessionFactory वस्तु दूसरे स्तर के कैश डेटा को रखती है। दूसरे स्तर के कैश में संग्रहीत डेटा पूरे एप्लिकेशन के लिए उपलब्ध होगा। लेकिन हमें इसे स्पष्ट रूप से सक्षम करने की आवश्यकता है।
एक दूसरे स्तर के कैश में, डोमेन hbm फाइलें महत्वपूर्ण परिवर्तनशील और मूल्य झूठी हो सकती हैं। उदाहरण के लिए, इस डोमेन वर्ग में एक दिन में कुछ अवधि सार्वभौमिक सत्य के रूप में स्थिर रहती है। तो, यह आवेदन भर में अपरिवर्तनीय के रूप में चिह्नित किया जा सकता है।