कई थ्रेड्स का उपयोग करके डेटाबेस में डेटा डालने की आवश्यकता है, लेकिन भले ही एक भी थ्रेड प्रतिबद्ध होने में विफल रहता है, सभी लेनदेन को रोलबैक करना होगा। इसे नीचे के दृष्टिकोण से हल करने का प्रयास किया।

थ्रेड के बीच कनेक्शन ऑब्जेक्ट साझा करना, और चाइल्ड थ्रेड के समाप्त होने की प्रतीक्षा करने के लिए join() का उपयोग करना, लेकिन यह खराब डिज़ाइन जैसा दिखता है, क्योंकि मैं थ्रेड्स के बीच कनेक्शन ऑब्जेक्ट साझा कर रहा हूं।

क्या कोई इसे हल करने के लिए बेहतर डिज़ाइन सुझा सकता है (सुनिश्चित नहीं है कि मुझे वितरित टीएक्सएन प्रबंधक के लिए जाना चाहिए या नहीं)?

0
dReAmEr 30 अप्रैल 2017, 21:11
पैरेंट थ्रेड में काउंटडाउनलैच का उपयोग करें docs.oracle.com /javase/7/docs/api/java/util/concurrent/…. रोलबैक को नियंत्रित करने और लेन-देन की प्रगति की निगरानी के लिए सेवपॉइंट और रोलबैक का भी उपयोग करें docs .oracle.com/javase/tutorial/jdbc/basics/transactions.html
 – 
Saurabh
30 अप्रैल 2017, 21:20
सेवपॉइंट और रोलबैक कनेक्शन स्तर पर काम करता है, और यदि मैं एकाधिक कनेक्शन का उपयोग करता हूं, तो यह केवल उस विशेष टीएक्सएन को रोलबैक करेगा, न कि सभी टीएक्सएन जो वर्तमान में अन्य धागे में निष्पादित किए जा रहे हैं।
 – 
dReAmEr
30 अप्रैल 2017, 21:32
मैं देखता हूं, तो यह कुछ लेनदेन प्रबंधक के उपयोग की मांग करता है। जेबॉस एक प्रदान करता है यदि आप इसे ऐप सर्वर के रूप में उपयोग कर रहे हैं लेकिन फिर यह आपके एप्लिकेशन को जेबॉस से भी जोड़ता है। मुझे यह ठीक से याद नहीं है लेकिन स्प्रिंग के पास कुछ टीएम पेशकश भी थी।
 – 
Saurabh
30 अप्रैल 2017, 21:46
2
एकाधिक धागे का उपयोग करने में बहुत सी बात नहीं है। अंततः इसे किसी स्तर पर डेटाबेस में अनुक्रमित किया जाएगा। बस एक ही लेन-देन में सभी अपडेट करें, और कुछ भी विफल होने पर इसे वापस रोल करें।
 – 
user207421
1 मई 2017, 03:36

1 उत्तर

सबसे बढ़िया उत्तर

मैं कुछ मध्यवर्ती डेटा संरचना में एकाधिक धागे से सभी SQL क्रियाओं को कतारबद्ध करने का सुझाव दूंगा, और फिर एक थ्रेड से डेटाबेस में डाल दूंगा। थ्रेड सुरक्षित मध्यवर्ती संरचनाएं जैसे ConcurrentHashMap, ConcurrentLinkedQueue होना संभव है या आप इसके साथ काम करते समय बस सिंक्रनाइज़ कर सकते हैं।

इस तरह आपको पहले से लेनदेन शुरू करने की भी जरूरत नहीं है। लंबित डेटा कम सुरक्षित हो सकता है, लेकिन मुझे लगता है कि वे डेटाबेस में अधिक सुरक्षित नहीं हैं, जबकि लेनदेन अभी तक प्रतिबद्ध नहीं है।

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

CountDownLatch का उपयोग यह पता लगाने के लिए करें कि सभी डेटा कब तैयार है और डेटाबेस राइटिंग थ्रेड को अपनी कार्रवाई शुरू करनी चाहिए। यदि कभी नहीं होता है, तो डेटाबेस लेखन थ्रेड के लिए रिएक्टर पैटर्न का उपयोग करें।

3
Audrius Meškauskas 30 अप्रैल 2017, 21:34