मेरे पास 5 एप्लिकेशन सर्वर पर एक वितरित जावा एप्लिकेशन चल रहा है। सर्वर 6 वें मशीन पर चल रहे एक ही ओरेकल 9आई डेटाबेस का उपयोग करते हैं।एक वितरित वातावरण में ओरेकल अनुक्रम आईडी-एस को प्रीफेच करने के लिए कैसे करें
एप्लिकेशन को अनुक्रम से 100 आईडी के बैच को प्रीफ़ेच करने की आवश्यकता है। यह एक एकल पिरोया, गैर वितरित वातावरण में करने के लिए अपेक्षाकृत आसान है, तुम सिर्फ इन क्वेरी भेज सकते हैं:
select seq.nextval from dual;
alter sequence seq increment by 100;
select seq.nextval from dual;
पहले चयन को हासिल करेगा पहले अनुक्रम ID कि आवेदन का उपयोग कर सकते हैं, दूसरे का चयन रिटर्न पिछले एक जिसका इस्तेमाल किया जा सकता है।
चीजें एक बहुप्रचारित वातावरण में और अधिक दिलचस्प हो जाती हैं। आप यह सुनिश्चित नहीं कर सकते कि दूसरे चयन से पहले एक और थ्रेड क्रमशः 100 तक अनुक्रम नहीं बढ़ाता है। जावा पक्ष पर पहुंच को सिंक्रनाइज़ करके इस समस्या को हल किया जा सकता है - आप केवल एक थ्रेड को एक ही समय में आईडी लाने शुरू करते हैं।
स्थिति सिंक्रनाइज़ नहीं हो सकती है जब स्थिति सिंक्रनाइज़ नहीं हो सकती है क्योंकि एप्लिकेशन के कुछ हिस्सों एक ही भौतिक मशीन पर भी नहीं, एक ही JVM पर नहीं चलते हैं। मुझे मंचों पर कुछ संदर्भ मिले कि दूसरों को भी इस समस्या को हल करने में समस्याएं हैं, लेकिन कोई भी जवाब वास्तव में उचित नहीं होने का उल्लेख नहीं कर रहा है।
क्या समुदाय इस समस्या का समाधान प्रदान कर सकता है?
कुछ अधिक जानकारी:
- मैं वास्तव में लेनदेन अलगाव स्तर के साथ नहीं खेल सकते हैं। मैं जेपीए का उपयोग करता हूं और परिवर्तन पूरे आवेदन को प्रभावित करेगा, न केवल prefetching प्रश्नों और यह मेरे लिए स्वीकार्य नहीं है।
PostgreSQL पर मैं निम्नलिखित कर सकता है:
चयन setval ('seq', nextval ('seq') + n - 1)
मैथ्यू द्वारा समाधान काम करता है जब आप एक निश्चित उपयोग कर सकते हैं वृद्धि मूल्य (जो मेरे मामले में पूरी तरह से स्वीकार्य है)। हालांकि, क्या कोई समाधान है जब आप वृद्धि के आकार को ठीक नहीं करना चाहते हैं, लेकिन इसे गतिशील रूप से समायोजित करना चाहते हैं?
ग्रेट उत्तर: ओ) – Andrew