2010-01-08 11 views
17

मैं एक प्रणाली है कि एक पर स्टार्टअप सोप कॉलjava.util.Prefs बैकिंगस्टोर अपवाद फेंकना - क्यों?

मैं उदाहरणों की जरूरत है और (मामले में सोप सेवा मर चुका है) स्टार्टअप पर अपने कैश को फिर से लोड करने में सक्षम होना भी संभावना है संभाल के छोटे/सरल परिणाम कैश है इस कैश फ़ाइल

का उपयोग कर कई उदाहरण की मैं java.util.prefs उपयोग करने के लिए चुना है, लेकिन जावा के builtin स्वचालित सिंक धागा रुक-रुक कर निम्न अपवाद डंपिंग (दुकान सिंक समर्थन डिफ़ॉल्ट JVM 30s का उपयोग कर समय का 1%) विफल हो रहा है:

Jan 8, 2010 12:30:07 PM java.util.prefs.FileSystemPreferences syncWorld 
WARNING: Couldn't flush user prefs: java.util.prefs.BackingStoreException: Couldn't get file lock. 

मुझे संदेह था this bug लेकिन यह 1.5 (बाघ-बी 40) में तय किया गया था और इस बॉक्स पर हमारा जावा 5 "1.5.0_16-बी 022" है।

मुझे अब संदेह है कि ऐसा इसलिए हो सकता है क्योंकि हमारे पास इस बैकिंग स्टोर को साझा करने वाले एकाधिक JVMs हैं, हालांकि यह हमारी अन्य मशीनों पर नहीं प्रतीत होता है।

क्या कोई इसकी पुष्टि कर सकता है? जोखिम क्या हैं, यदि कोई है?

यदि मेरा दृष्टिकोण त्रुटिपूर्ण है तो मुझे वैकल्पिक के रूप में क्या उपयोग करना चाहिए?

+2

कुछ कोड दें, हमें उम्मीद नहीं है कि – Bozho

+1

निश्चित रूप से लगता है जैसे यह एक ही फ़ाइल के साथ काम करने की कोशिश कर रहे एकाधिक JVMs से संबंधित होगा।लोग डेटा को केंद्रीकृत करने के लिए डाटाबेस का उपयोग करते हैं और कई प्रक्रियाओं के साथ समवर्ती रूप से संशोधित होते हैं। – BryanD

+2

'java.util.prefs' एपीआई एक तुर्की है। मैं इसे अनदेखा करने और डेटाबेस का उपयोग करने वाले अन्य लोगों का उपयोग करने का सुझाव देता हूं। – skaffman

उत्तर

8

"अब मैं संदेह है क्योंकि हम इस बैकिंग संग्रह साझा करने के लिए कई JVMs है कि यह हो सकता है"

यह बिल्कुल मामला हो सकता है! यदि दो JVMs फ़ाइल को लॉक करने का प्रयास करते हैं तो यह वही है जो आप देखेंगे।

सटीक विवरण लॉक, ऑपरेटिंग सिस्टम और फ़ाइल सिस्टम के प्रकार पर निर्भर करेगा।

आप ऑपरेशन को लपेटने का प्रयास करना चाहेंगे जो इसे किसी प्रयास/पकड़ ब्लॉक में ले जाता है, फिर विफल होने पर ऑपरेशन को फिर से प्रयास करें।

+3

आपके उत्तर के लिए धन्यवाद। असल में समस्या यह है कि जावा प्राथमिकता के लिए सिंक थ्रेड हमारे नियंत्रण से बाहर है, इसलिए अपवादों को पकड़ नहीं सकता है। यहां अच्छी आलोचना: http://www.allaboutbalance.com/articles/disableprefs/ – HaveAGuess

0

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

+0

समस्या यह है कि मुझे स्टार्टअप पर अपने कैश को फिर से लोड करने में सक्षम होने के उदाहरणों की आवश्यकता है (यदि एसओएपी सेवा मर गई है) और साथ ही एकाधिक की संभावना को संभालने में भी समस्या है इस कैश फ़ाइल का उपयोग कर उदाहरण। मैं OP – HaveAGuess

0

मैं जेटी के साथ एक ही मुद्दे में भाग गया। मैंने निम्नलिखित मुद्दे को हल किया।

अपनी जेआरई निर्देशिका में .systemPrefs जोड़ें और शिकायत करने वाली प्रक्रिया को चलाने वाले उपयोगकर्ता तक पहुंच प्रदान करें।

एक बार यह हो जाता है, जेट्टी निर्देशिका पर जाकर start.ini फ़ाइल

खोलने - Djava.util.prefs.userRoot={user's home directory}

-Djava.util.prefs.systemRoot={user's home directory}

एक बार उन पंक्तियों मैं घाट को पुन: प्रारंभ जोड़ने का काम पूरा किया और पाया कि त्रुटियों जा चुके थे ।

+0

में जोड़ूंगा, मुझे लगता है कि यह उस जेआरई का उपयोग करके उस स्टोर को बदलकर काम करता है, जो अन्य जेआरई के साथ संघर्ष से बचने के लिए आपको चलाना चाहिए। साझा करने के लिए धन्यवाद – HaveAGuess

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