java - स्प्रिंग और हाइबरनेट का उपयोग करके कई डेटाबेस में वितरित लेनदेन करने का सबसे अच्छा तरीका क्या है




hibernate spring (4)

मेरे पास एक एप्लीकेशन है - एक उपयोगिता की तरह - जो एक कोने में बैठता है और समय-समय पर दो अलग-अलग डेटाबेस अपडेट करता है।

यह एक छोटा सा स्टैंडअलोन ऐप है जिसे स्प्रिंग एप्लिकेशन संदर्भ के साथ बनाया गया है। इस संदर्भ में स्प्रिंग में कॉन्फ़िगर किए गए कॉमन्स डीबीसीपी डेटा स्रोतों का उपयोग करके कॉन्फ़िगर किए गए दो हाइबरनेट सत्र कारखानों में कॉन्फ़िगर किया गया है।

वर्तमान में कोई लेनदेन प्रबंधन नहीं है, लेकिन मैं कुछ जोड़ना चाहता हूं। एक डेटाबेस में अद्यतन दूसरे के लिए एक सफल अद्यतन पर निर्भर करता है।

ऐप जावा ईई कंटेनर में नहीं बैठता है - यह शेल स्क्रिप्ट से बुलाए गए स्थिर लॉन्चर क्लास द्वारा बूटस्ट्रैप किया जाता है। लॉन्चर क्लास एप्लिकेशन संदर्भ को तुरंत चालू करता है और फिर अपने बीन्स में से एक पर एक विधि का आह्वान करता है।

डेटाबेस अपडेट के आसपास लेनदेन को रखने का सबसे अच्छा तरीका क्या है?

मैं आपको 'सर्वश्रेष्ठ' की परिभाषा छोड़ दूंगा, लेकिन मुझे लगता है कि यह 'सेट अप करने में आसान', 'कॉन्फ़िगर करने में आसान', 'सस्ती', और 'पैकेज करने में आसान और पुनर्वितरण' का कुछ कार्य होना चाहिए। स्वाभाविक रूप से एफओएसएस अच्छा होगा।


अपने संदर्भ में एक लेनदेन प्रबंधक सेटअप करें। वसंत दस्तावेज़ों में उदाहरण हैं, और यह बहुत आसान है। फिर जब आप एक लेनदेन निष्पादित करना चाहते हैं:

try { 
    TransactionTemplate tt = new TransactionTemplate(txManager);

    tt.execute(new TransactionCallbackWithoutResult(){
    protected void doInTransactionWithoutResult(
            TransactionStatus status) {
        updateDb1();
        updateDb2();
    }
} catch (TransactionException ex) {
    // handle 
}

अधिक उदाहरणों के लिए, और जानकारी शायद इसे देखें: वसंत का उपयोग कर एक्सए लेनदेन



एक से अधिक डेटाबेस पर लेनदेन वितरित करने का सबसे अच्छा तरीका है: नहीं।

कुछ लोग आपको एक्सए पर इंगित करेंगे लेकिन एक्सए (या दो चरण कमिट) एक झूठ (या मार्केटिज) है।

कल्पना कीजिए: पहले चरण के बाद एक्सए मैनेजर को बताया गया है कि यह अंतिम प्रतिबद्धता भेज सकता है, डेटाबेस में से किसी एक के लिए नेटवर्क कनेक्शन विफल रहता है। अब क्या? समय समाप्त? वह अन्य डेटाबेस दूषित छोड़ देगा। रोलबैक? दो समस्याएं: आप एक प्रतिबद्धता वापस नहीं ले सकते हैं और आप कैसे जानते हैं कि दूसरे डेटाबेस के साथ क्या हुआ? हो सकता है कि सफलतापूर्वक डेटा को पूरा करने के बाद नेटवर्क कनेक्शन विफल हो गया और केवल "सफलता" संदेश खो गया था?

डेटा को एक ही स्थान पर कॉपी करना सबसे अच्छा तरीका है। एक ऐसी योजना का उपयोग करें जो आपको प्रतिलिपि बनाने और इसे किसी भी समय जारी रखने की अनुमति देता है (उदाहरण के लिए, आपके पास पहले से मौजूद डेटा को अनदेखा करें या आईडी द्वारा चयन का ऑर्डर करें और केवल अपनी प्रतिलिपि के रिकॉर्ड> MAX (आईडी) का अनुरोध करें)। लेनदेन के साथ इसे सुरक्षित रखें। यह कोई समस्या नहीं है क्योंकि आप केवल स्रोत से डेटा पढ़ रहे हैं, इसलिए जब किसी भी कारण से लेनदेन विफल रहता है, तो आप स्रोत डेटाबेस को अनदेखा कर सकते हैं। इसलिए, यह एक सादा पुराना एकल स्रोत लेनदेन है।

डेटा कॉपी करने के बाद, इसे स्थानीय रूप से संसाधित करें।


जब आप "दो अलग-अलग डेटाबेस" कहते हैं, तो क्या आप एक ही डीबी सर्वर के भीतर अलग डेटाबेस सर्वर, या दो अलग-अलग स्कीमा का मतलब रखते हैं?

यदि पूर्व, तो यदि आप पूर्ण लेनदेन चाहते हैं, तो आपको एक्सए लेनदेन एपीआई की आवश्यकता है, जो पूर्ण दो चरण प्रतिबद्धता प्रदान करता है। लेकिन सबसे महत्वपूर्ण बात यह है कि आपको एक लेनदेन समन्वयक / मॉनिटर की भी आवश्यकता होती है जो विभिन्न डेटाबेस सिस्टम के बीच लेनदेन प्रसार का प्रबंधन करता है। यह जावाईई स्पेक का हिस्सा है, और उस पर इसका एक दुर्लभ दुर्लभ हिस्सा है। TX समन्वयक स्वयं सॉफ्टवेयर का एक जटिल टुकड़ा है। आपका एप्लिकेशन सॉफ़्टवेयर (वसंत के माध्यम से, यदि आप चाहें तो) समन्वयक से बात करते हैं।

यदि, हालांकि, आप एक ही डीबी सर्वर के भीतर दो डेटाबेस का मतलब रखते हैं, तो वेनिला जेडीबीसी लेनदेन को ठीक काम करना चाहिए, केवल एक ही लेनदेन के भीतर दोनों डेटाबेस के खिलाफ अपने परिचालन करें।





xa