2008-09-07 15 views
7

हमारे डिज़ाइन में एक jvm है जो एक jboss/webapp (पढ़/लिखना) है जिसका उपयोग हाइबरनेट (जेपीए का उपयोग करके) को डीबी में बनाए रखने के लिए किया जाता है। इस संबंध में संबंधों में 3-5 स्तरों के साथ मॉडल में 10-15 लगातार कक्षाएं हैं।दो जावा अनुप्रयोगों को चलाने वाले हाइबरनेट कैश स्थिरता को कैसे बनाए रखें?

हमारे पास एक अलग जेवीएम है जो इस डेटा का उपयोग कर सर्वर है। चूंकि यह लगातार चल रहा है, हमारे पास सिर्फ एक लंबा डीबी सत्र है (केवल पढ़ने के लिए)। इसलिए हम स्वयं दूसरे से JVM संकेत -

वर्तमान में कोई अंतर JVM कैश शामिल है।

अब जब वेबपैप कुछ डेटा बदलता है, तो यह सर्वर को बदले गए डेटा को पुनः लोड करने के लिए संकेत देता है। हमने जो पाया है वह है कि हमें डेटा को शुद्ध करने के लिए हाइबरनेट को बताना होगा और फिर इसे पुनः लोड करना होगा। बस डीबी के साथ एक fetch/विलय करना नौकरी नहीं करता है - मुख्य रूप से वस्तुओं के संबंध में पदानुक्रम के नीचे कई परतें।

कि क्या वहाँ कुछ भी इस डिजाइन के साथ या अगर किसी को भी इस कर रहा है और पुनः लोड पर हाइबरनेट के साथ काम करने के साथ बेहतर किस्मत पड़ा है मौलिक रूप से गलत है पर कोई विचार।

धन्यवाद, क्रिस

उत्तर

10

एक हाइबरनेट सत्र डीबी से पढ़े गए सभी डेटा को लोड करता है जिसे वे प्रथम-स्तर कैश कहते हैं। एक बार जब पंक्ति डीबी से लोड हो जाती है, तो उसी पीके के साथ किसी भी पंक्ति के लिए किसी भी आगामी fetches डेटा को इस कैश से वापस कर देगा। इसके अलावा, एक ही सत्र में एक ही पीके के साथ वस्तुओं के लिए हाइबरनेट gaurentees संदर्भ समानता।

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

कार्रवाई मेरा सुझाव कर सकते हैं का सबसे सरल और सर्वोत्तम कोर्स को बंद करने और खुला सत्र के रूप में की जरूरत है। यह पूरी समस्या को दूर करता है। हाइबरनेट सत्र डीबी के साथ एक अल्पकालिक बातचीत के लिए एक खिड़की बनने का इरादा है। मैं मानता हूं कि ऑब्जेक्ट-ग्राफ़ को बार-बार पुनः लोड नहीं करके प्रदर्शन लाभ होता है; लेकिन आपको इसे मापने और खुद को मनाने की जरूरत है कि यह दर्द के लायक है।

एक और विकल्प समय-समय पर सत्र को बंद और फिर से खोलना है। यह सुनिश्चित करता है कि केवल-पढ़ने वाला एप्लिकेशन उस डेटा के साथ काम करता है जो किसी दिए गए समय अंतराल से पुराना नहीं है। लेकिन निश्चित रूप से एक खिड़की है जहां केवल पढ़ने के लिए आवेदन स्टेल डेटा के साथ काम करता है (हालांकि डिजाइन गारंटी देता है कि यह अंततः अद्यतित डेटा प्राप्त करता है)। यह कई अनुप्रयोगों में अनुमत हो सकता है - आपको अपनी स्थिति का मूल्यांकन करने की आवश्यकता है।

तीसरा विकल्प दूसरे स्तर के कैश कार्यान्वयन का उपयोग करना है, और अल्पकालिक सत्रों का उपयोग करना है। विभिन्न कैशिंग पैकेज हैं जो रिश्तेदार गुणों और दोषों के साथ हाइबरनेट के साथ काम करते हैं।

+0

जेपीए का उपयोग करना, और @PersistenceContext EntityManager पाने के लिए - लेकिन ऐसा लगता है कि हम एक EntityManagerFactory के लिए @PersistenceUnit की जरूरत है और डेटा ताज़ा करने के लिए, हम एक नई EntityManager मिलता है। ठीक लगता है - लेकिन चीज़ों को अद्यतन करने के लिए भारी हाथी तरीका, लेकिन अगर लोग ऐसा करते हैं ... –

3

क्रिस, मैं एक छोटे से अपनी परिस्थितियों के बारे में उलझन में हूँ। यदि मैं सही ढंग से समझता हूं, तो आपके पास साझा डेटाबेस तक पहुंचने के लिए हाइबरनेट का उपयोग करके एक स्टैंडअलोन एप्लिकेशन (केवल पढ़ने के लिए) एक वेब ऐप (पढ़ना/लिखना) है। वेब ऐप के साथ आपके द्वारा किए गए परिवर्तन स्टैंडअलोन ऐप पर दिखाई नहीं दे रहे हैं। क्या वह सही है?

यदि हां, तो क्या आपने एक अलग दूसरे-स्तर के कैश कार्यान्वयन का उपयोग करने पर विचार किया है? मैं सोच रहा हूं कि क्या आप एक क्लस्टर कैश का उपयोग करने में सक्षम हो सकते हैं जो दोनों वेब एप्लिकेशन और स्टैंडअलोन एप्लिकेशन द्वारा साझा किया जाता है। मेरा मानना ​​है कि स्वार कैश, जो हाइबरनेट के साथ एकीकृत है, इसकी अनुमति देगा, लेकिन मैंने इसे स्वयं नहीं किया है।

सामान्य में, हालांकि, आपको पता होना चाहिए कि किसी दिए गए कैश की सामग्री को किसी अन्य एप्लिकेशन द्वारा गतिविधि के बारे में पता होना कभी नहीं होगा (यही कारण है कि मैं दोनों क्षुधा एक कैश का हिस्सा होने का सुझाव है)। सौभाग्य!

2

मेरे दृष्टिकोण से, आपको उस पर अपना अंडरलाइन हाइबरनेट कैश बदलना चाहिए, जो क्लस्टर मोड का समर्थन करता है। यह JBoss Cache या Swarm Cache हो सकता है। पहले व्यक्ति को डेटा सिंक्रनाइज़ेशन (प्रतिकृति और अमान्यता) का बेहतर समर्थन होता है और जेटीए का भी समर्थन करता है।

फिर आप वेबएप और सर्वर के बीच कैश सिंक्रनाइज़ेशन कॉन्फ़िगर करने में सक्षम होंगे। यदि आप जेबॉस कैश का उपयोग करेंगे तो अलगाव स्तर को भी देखें। मेरा मानना ​​है कि यदि आप उसी सत्र से किसी सर्वर पर नया डेटा प्राप्त करना चाहते हैं तो आपको READ_COMMITTED मोड का उपयोग करना चाहिए।

1

सबसे अधिक प्रयुक्त अभ्यास Container-Managed Entity Manager है ताकि एक ही कंटेनर में दो या दो से अधिक अनुप्रयोग (यानी ग्लासफ़िश, टॉमकैट, वेबस्पेयर) एक ही कैश साझा कर सकें। लेकिन यदि आप एप्लिकेशन कंटेनर का उपयोग नहीं करते हैं, क्योंकि आप Play का उपयोग करते हैं! उदाहरण के लिए, तो मैं कैश में लगातार पढ़ने/लिखने के लिए प्राथमिक अनुप्रयोग में कुछ webservices का निर्माण करूंगा।

मुझे लगता है कि पुराने डेटा का उपयोग आपदा के लिए एक खुला दरवाजा है। सिंगलटन मल्टीटन्स बनने की तरह ही, केवल पढ़ने के लिए एप्लिकेशन अक्सर लिखते हैं कभी-कभी लिखें।

बेल्ट और धनुकोष्ठक :)