समवर्ती रणनीतियाँ
हाइबरनेट में दूसरे स्तर के कैशिंग को सक्षम करने के बाद, आपको हाइबरनेट को समझाना होगा कि हम किस एंटिटी ऑब्जेक्ट को कैश करना चाहते हैं और कैसे।
ऐसा करने के लिए, हाइबरनेट में एंटिटी क्लासेस - @Cache के लिए एक विशेष एनोटेशन है । उदाहरण:
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
इस एनोटेशन को प्रत्येक इकाई इकाई के लिए लिखा जाना चाहिए जिसके लिए हम दूसरे स्तर के कैश का उपयोग करना चाहते हैं। उदाहरण:
@Entity
@Table(name = "employee")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Employee {
@Id
private Integer id;
private Set<Task> tasks;
}
कैश्ड इकाई के लिए हाइबरनेट में 4 संभावित एक्सेस रणनीतियाँ हैं यदि इसे विभिन्न थ्रेड्स से एक्सेस किया जाता है:
- केवल पढ़ने के लिए
- पढ़ना लिखना
- गैर-सख्त-पढ़ना-लिखना
- लेन-देन संबंधी
केवल पढ़ने के लिए । एक डेटा-उपयुक्त समवर्ती रणनीति जो कभी नहीं बदलती। हाइबरनेट बस इन वस्तुओं को अपनी स्मृति में संग्रहित करेगा। इसका उपयोग केवल संदर्भ डेटा के लिए करें।
डेटाबेस बहुत सारी जानकारी संग्रहीत करते हैं जो कभी नहीं बदलती। उदाहरण के लिए, एक तालिका उन घटनाओं की सूची रखती है जो केवल जोड़ी जाती हैं लेकिन कभी बदली या हटाई नहीं जाती हैं। यदि आपको इस तालिका के साथ हाइबरनेट के माध्यम से काम करने की आवश्यकता है, तो रीड-ओनली कैशिंग रणनीति आपके अनुरूप होगी।
पढ़ना-लिखना (पढ़ना-लिखना)। मुख्य रूप से पठनीय डेटा के लिए इस रणनीति का उपयोग करें। हालाँकि, हाइबरनेट इस डेटा को बदलने के प्रयासों को ट्रैक करेगा, हालाँकि यह अपेक्षा करता है कि वे बहुत कम होंगे।
आपको मुख्य रूप से उन वस्तुओं को कैश करने की आवश्यकता है जो शायद ही कभी बदलते हैं और अक्सर पढ़े / अनुरोध किए जाते हैं। यदि आपके पास ऐसी वस्तुएँ हैं, तो आपको उनके लिए पढ़ने-लिखने की रणनीति का उपयोग करने की आवश्यकता है।
नॉनस्ट्रिक्ट-रीड-राइट । यह रणनीति कैश और डेटाबेस के बीच स्थिरता की गारंटी नहीं देती है। इस रणनीति का उपयोग करें यदि डेटा लगभग कभी नहीं बदलता है और बासी डेटा की एक छोटी सी संभावना एक गंभीर समस्या नहीं है।
रीड-राइट स्ट्रैटेजी के विपरीत, यह स्ट्रैटेजी मानती है कि म्यूटेबल डेटा को पढ़ने के लिए लॉक नहीं किया जाता है। इसका परिणाम यह हो सकता है कि वस्तु एक स्थान पर बदली जा रही है, जबकि दूसरे स्थान पर कोई इसका पुराना संस्करण पढ़ रहा है।
उदाहरण के लिए, एक उपयोगकर्ता ने अपनी टिप्पणी बदल दी है, लेकिन अन्य उपयोगकर्ता अभी भी कुछ समय के लिए उसका पुराना संस्करण देखते हैं। यदि यह आपके लिए कोई समस्या नहीं है, तो नॉनस्ट्रिक्ट-रीड-राइट रणनीति का उपयोग करें।
लेन-देन । मुख्य रूप से रीड-ओनली डेटा के लिए इस रणनीति का उपयोग करें जहां अपडेट के दुर्लभ अवसर पर समवर्ती लेनदेन में बासी डेटा को रोकना महत्वपूर्ण है।
कैश में डेटा स्टोर करना
दूसरे स्तर के कैश के बारे में एक और महत्वपूर्ण विवरण जो आपको याद रखना चाहिए वह यह है कि हाइबरनेट आपकी कक्षाओं की वस्तुओं को स्वयं संग्रहीत नहीं करता है। यह सूचनाओं को तार, संख्या आदि के सरणियों के रूप में संग्रहीत करता है।
और वस्तु पहचानकर्ता इस जानकारी के सूचक के रूप में कार्य करता है। वैचारिक रूप से, यह एक मानचित्र जैसा कुछ है, जिसमें वस्तु की आईडी कुंजी है, और डेटा सरणियाँ मूल्य हैं। आप इसकी कल्पना इस प्रकार कर सकते हैं:
1 -> { "Ivanov", 1, null , {1,2,5} }
2 -> { "Petrov", 2, null , {1,2,5} }
3 -> { "Sidorov", 3, null , {1,2,5} }
प्रत्येक वस्तु कितनी अतिरिक्त मेमोरी लेती है, इस पर विचार करना बहुत ही उचित है।
उपरोक्त के अलावा, आपको याद रखना चाहिए कि आपके Entity वर्ग की निर्भरताएँ भी डिफ़ॉल्ट रूप से कैश नहीं की जाती हैं। उदाहरण के लिए, यदि हम उपरोक्त वर्ग, कर्मचारी पर विचार करते हैं , तो लाते समय, कार्य संग्रह डेटाबेस से पुनर्प्राप्त किया जाएगा , न कि दूसरे स्तर के कैश से ।
यदि आप निर्भरता को भी कैश करना चाहते हैं, तो कक्षा इस तरह दिखनी चाहिए:
@Entity
@Table(name = "employee")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Employee {
@Id
private Integer id;
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
private Set<Task> tasks;
}
और अंतिम विवरण - दूसरे स्तर के कैश से पढ़ना तभी होता है जब प्रथम स्तर के कैश में वांछित वस्तु नहीं मिली थी।
कैशमोड
हाइबरनेट बहुत लचीले कैशिंग प्रबंधन की अनुमति देता है। आप प्रत्येक व्यक्तिगत सत्र या यहां तक कि प्रत्येक डेटाबेस अनुरोध के लिए कैश मोड सेट कर सकते हैं।
ऐसे पाँच तरीके हैं:
- पाना
- अनदेखा करना
- सामान्य
- रखना
- रीफ़्रेश करें
नीचे दी गई तालिका उनके कार्यों का वर्णन करती है:
कैशमोड | विवरण |
---|---|
पाना | डेटा को कैश से पढ़ा जाता है लेकिन इसमें जोड़ा नहीं जाता है। |
अनदेखा करना | सत्र कैश के साथ इंटरैक्ट नहीं करता है। |
सामान्य | डेटा को कैश से पढ़ा जाता है और उसमें जोड़ा जाता है। |
रखना | डेटा कभी भी कैश से नहीं लिया जाता है, बल्कि उसमें जोड़ा जाता है। |
रीफ़्रेश करें | डेटा कभी भी कैश से नहीं लिया जाता है, बल्कि उसमें जोड़ा जाता है। इस मोड में, hibernate.cache.use_minimal_puts सेटिंग का अतिरिक्त रूप से उपयोग किया जाता है। |
सत्र के लिए कैश मोड सेट करने का एक उदाहरण:
session.setCacheMode(CacheMode.GET);
Employee director = session.createQuery("from Employee where id = 4").uniqueResult();
और सत्र और अनुरोध के लिए मोड सेट करने का एक उदाहरण भी:
session.setCacheMode(CacheMode.GET);
Query query = session.createQuery("from Employee where id = 4");
query.setCacheMode(CacheMode.IGNORE); // Ignore cache work for this request
Employee director = query.uniqueResult();