अंतर्निहित समस्या जिसे मैं हल करना चाहता हूं वह एक ऐसा कार्य चला रहा है जो MySQL में कई अस्थायी तालिकाओं को उत्पन्न करता है, जिसे बनाए जाने के बाद जावा से परिणाम प्राप्त करने के लिए पर्याप्त समय तक रहने की आवश्यकता होती है। शामिल डेटा के आकार के कारण, कार्य बैचों में पूरा होना चाहिए। प्रत्येक बैच जेडीबीसी के माध्यम से बुलाए गए संग्रहीत प्रक्रिया के लिए एक कॉल है। पूरी प्रक्रिया में बड़े डेटा सेट के लिए आधे घंटे या अधिक समय लग सकता है।वसंत और हाइबरनेट के साथ लंबे समय से चल रहे लेनदेन?
अस्थायी टेबल तक पहुंच सुनिश्चित करने के लिए, मैं संपूर्ण कार्य चलाने के लिए, एक TransactionCallbackWithoutResult के साथ एक एकल वसंत लेनदेन में, समाप्त करने के लिए शुरू करते हैं। अन्यथा, मुझे एक अलग कनेक्शन मिल सकता है जिसके पास अस्थायी तालिकाओं तक पहुंच नहीं है (यह कभी-कभी लेनदेन में सबकुछ लपेटने से पहले होता है)।
यह मेरे विकास पर्यावरण में ठीक काम करता है।
java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction
यह हुआ जब एक अलग कार्य मेरी लंबी चलने वाली लेन-देन के निष्पादन के दौरान एक ही टेबल के कुछ पहुँचने का प्रयास किया: हालांकि, उत्पादन में मैं निम्न अपवाद मिला है। मुझे क्या भ्रमित करता है कि लंबे समय तक चलने वाला लेनदेन केवल अस्थायी तालिकाओं में प्रवेश करता है या अपडेट करता है। गैर-अस्थायी तालिकाओं तक पहुंच केवल तभी चयन की जाती है। मुझे कौन से दस्तावेज मिल सकते हैं, डिफ़ॉल्ट वसंत लेनदेन अलगाव स्तर को इस मामले में MySQL को अवरुद्ध नहीं करना चाहिए।
तो मेरा पहला सवाल है, यह सही दृष्टिकोण है? क्या मैं यह सुनिश्चित कर सकता हूं कि मैं लंबे समय से चलने वाले लेनदेन के बिना हाइबरनेट टेम्पलेट के माध्यम से बार-बार एक ही कनेक्शन प्राप्त करूं?
तो लंबी चलने वाली लेन-देन दृष्टिकोण सही एक है, अलगाव स्तर के संदर्भ में मैं क्या जाँच करनी चाहिए? क्या मेरी समझ सही है कि वसंत/MySQL लेनदेन में डिफ़ॉल्ट अलगाव स्तर को उन तालिकाओं को लॉक नहीं करना चाहिए जिन्हें केवल चयन के माध्यम से उपयोग किया जाता है? डीबग करने के लिए मैं क्या कर सकता हूं कि कौन सी टेबल संघर्ष कर रही हैं, और उन तालिकाओं को लेनदेन से लॉक होने से रोकें?
क्या आपके पास "कनेक्शन बनाए रखने" समस्या का समाधान है? मेरे मामले में, स्प्रिंग और हाइबरनेट डाटाबेस से मेरा कनेक्शन मध्यस्थता करता है, और मुझे एक ही लेनदेन में सबकुछ लपेटने के बिना हर बार एक ही कनेक्शन प्राप्त करने में परेशानी होती है। एक ही कनेक्शन को बनाए रखने के बिना, मैं अस्थायी तालिकाओं तक पहुंच खो देता हूं। – jimbokun
यदि आप किसी आईडी के साथ वर्कॉगॉग रखते हैं और बैच प्रोसेसिंग में मिले मील का पत्थर आप TEMP_ _STUFF जैसे नियमित टेबल बना सकते हैं। पहुंचने वाले मील का पत्थर के आधार पर आप आगे बढ़ सकते हैं और निरस्त बैच प्रक्रियाओं के साथ जारी रख सकते हैं। प्रसंस्करण के बाद एक (यानी मील का पत्थर पहुंच गया) टेबल हटा दें और लॉग इन करें कि आप मील का पत्थर 'साफ' पहुंचे। सभी प्रसंस्करण अब ठीक दाग लेनदेन के साथ किया जा सकता है। इस दृष्टिकोण में असुविधाजनक यह है कि बैच नौकरी शुरू होने पर आपको डीबी की स्थिति का "स्नैपशॉट" दिखाई नहीं देता है। यह एक मुद्दा हो सकता है या नहीं भी हो सकता है। –
यह बहुत अच्छी सलाह है। हालांकि, मेरे पास एक शेष मुद्दा है। प्रारंभिक प्रसंस्करण में से कुछ अस्थायी सारणी बनाती हैं जिन्हें प्रत्येक बैच में एक्सेस किया जाता है। इस प्रारंभिक प्रसंस्करण में काफी समय लगता है, पर्याप्त है कि यह एक महत्वपूर्ण प्रदर्शन हिट होगा यदि इसे प्रत्येक बैच के लिए दोहराया जाना था। मुझे यकीन नहीं है कि इस प्रारंभिक प्रसंस्करण को कैसे संभाला जाए, लेकिन मैं इसे और अधिक विचार दूंगा। – jimbokun