2010-06-02 9 views
5

अंतर्निहित समस्या जिसे मैं हल करना चाहता हूं वह एक ऐसा कार्य चला रहा है जो MySQL में कई अस्थायी तालिकाओं को उत्पन्न करता है, जिसे बनाए जाने के बाद जावा से परिणाम प्राप्त करने के लिए पर्याप्त समय तक रहने की आवश्यकता होती है। शामिल डेटा के आकार के कारण, कार्य बैचों में पूरा होना चाहिए। प्रत्येक बैच जेडीबीसी के माध्यम से बुलाए गए संग्रहीत प्रक्रिया के लिए एक कॉल है। पूरी प्रक्रिया में बड़े डेटा सेट के लिए आधे घंटे या अधिक समय लग सकता है।वसंत और हाइबरनेट के साथ लंबे समय से चल रहे लेनदेन?

अस्थायी टेबल तक पहुंच सुनिश्चित करने के लिए, मैं संपूर्ण कार्य चलाने के लिए, एक TransactionCallbackWithoutResult के साथ एक एकल वसंत लेनदेन में, समाप्त करने के लिए शुरू करते हैं। अन्यथा, मुझे एक अलग कनेक्शन मिल सकता है जिसके पास अस्थायी तालिकाओं तक पहुंच नहीं है (यह कभी-कभी लेनदेन में सबकुछ लपेटने से पहले होता है)।

यह मेरे विकास पर्यावरण में ठीक काम करता है।

java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction 

यह हुआ जब एक अलग कार्य मेरी लंबी चलने वाली लेन-देन के निष्पादन के दौरान एक ही टेबल के कुछ पहुँचने का प्रयास किया: हालांकि, उत्पादन में मैं निम्न अपवाद मिला है। मुझे क्या भ्रमित करता है कि लंबे समय तक चलने वाला लेनदेन केवल अस्थायी तालिकाओं में प्रवेश करता है या अपडेट करता है। गैर-अस्थायी तालिकाओं तक पहुंच केवल तभी चयन की जाती है। मुझे कौन से दस्तावेज मिल सकते हैं, डिफ़ॉल्ट वसंत लेनदेन अलगाव स्तर को इस मामले में MySQL को अवरुद्ध नहीं करना चाहिए।

तो मेरा पहला सवाल है, यह सही दृष्टिकोण है? क्या मैं यह सुनिश्चित कर सकता हूं कि मैं लंबे समय से चलने वाले लेनदेन के बिना हाइबरनेट टेम्पलेट के माध्यम से बार-बार एक ही कनेक्शन प्राप्त करूं?

तो लंबी चलने वाली लेन-देन दृष्टिकोण सही एक है, अलगाव स्तर के संदर्भ में मैं क्या जाँच करनी चाहिए? क्या मेरी समझ सही है कि वसंत/MySQL लेनदेन में डिफ़ॉल्ट अलगाव स्तर को उन तालिकाओं को लॉक नहीं करना चाहिए जिन्हें केवल चयन के माध्यम से उपयोग किया जाता है? डीबग करने के लिए मैं क्या कर सकता हूं कि कौन सी टेबल संघर्ष कर रही हैं, और उन तालिकाओं को लेनदेन से लॉक होने से रोकें?

उत्तर

1

आप जब कहते हैं कि अपनी मेज अस्थायी है, यह लेन-देन दायरे वाला? इससे अन्य लेन-देन हो सकते हैं (शायद एक अलग लेनदेन पर) इसे देखने/एक्सेस करने में सक्षम नहीं है। शायद एक असली टेबल और एक अस्थायी तालिका शामिल होने में शामिल होने से वास्तविक तालिका को ताला लगा दिया जाता है।

रूट कारण: क्या आपने कनेक्शन को लॉक करने का निर्धारण करने के लिए MySQL टूल का उपयोग करने का प्रयास किया है? यह अगली पंक्ति लॉकिंग की तरह कुछ हो सकता है। मैं MySQL टूल्स को अच्छी तरह से नहीं जानता, लेकिन ऑरैकल पर आप देख सकते हैं कि कौन से कनेक्शन अन्य कनेक्शन अवरुद्ध कर रहे हैं।

लेनदेन समय समाप्ति: आपको एक लंबा कनेक्शन समय/डेटा स्रोत बनाना चाहिए। अपने लंबे समय तक चलने वाले कार्य के लिए उस कनेक्शन पूल का उपयोग करें। मुझे लगता है कि आपका उत्पादन वातावरण अटकने वाले कनेक्शन का पता लगाकर आपकी मदद करने के लिए 'कोशिश कर रहा है'।

6

मैं एक विस्तारित समय बुराई के लिए लेनदेन को खोलने पर विचार करता हूं। मेरे करियर के दौरान "विस्तारित" की परिभाषा सेकेंड से मिली-सेकंड तक गिर गई है।

यह गैर repeatable समस्याओं और headscratching समस्याओं का एक अंतहीन स्रोत है।

मैं इस मामले में गोली काटने और सॉफ्टवेयर है जो आप रिवर्स में ही पुन: साफ करने के लिए करता है, तो बैच में विफल रहता है सकते हैं में एक 'काम लॉग' रखना होगा।

+0

क्या आपके पास "कनेक्शन बनाए रखने" समस्या का समाधान है? मेरे मामले में, स्प्रिंग और हाइबरनेट डाटाबेस से मेरा कनेक्शन मध्यस्थता करता है, और मुझे एक ही लेनदेन में सबकुछ लपेटने के बिना हर बार एक ही कनेक्शन प्राप्त करने में परेशानी होती है। एक ही कनेक्शन को बनाए रखने के बिना, मैं अस्थायी तालिकाओं तक पहुंच खो देता हूं। – jimbokun

+0

यदि आप किसी आईडी के साथ वर्कॉगॉग रखते हैं और बैच प्रोसेसिंग में मिले मील का पत्थर आप TEMP_ _STUFF जैसे नियमित टेबल बना सकते हैं। पहुंचने वाले मील का पत्थर के आधार पर आप आगे बढ़ सकते हैं और निरस्त बैच प्रक्रियाओं के साथ जारी रख सकते हैं। प्रसंस्करण के बाद एक (यानी मील का पत्थर पहुंच गया) टेबल हटा दें और लॉग इन करें कि आप मील का पत्थर 'साफ' पहुंचे। सभी प्रसंस्करण अब ठीक दाग लेनदेन के साथ किया जा सकता है। इस दृष्टिकोण में असुविधाजनक यह है कि बैच नौकरी शुरू होने पर आपको डीबी की स्थिति का "स्नैपशॉट" दिखाई नहीं देता है। यह एक मुद्दा हो सकता है या नहीं भी हो सकता है। –

+0

यह बहुत अच्छी सलाह है। हालांकि, मेरे पास एक शेष मुद्दा है। प्रारंभिक प्रसंस्करण में से कुछ अस्थायी सारणी बनाती हैं जिन्हें प्रत्येक बैच में एक्सेस किया जाता है। इस प्रारंभिक प्रसंस्करण में काफी समय लगता है, पर्याप्त है कि यह एक महत्वपूर्ण प्रदर्शन हिट होगा यदि इसे प्रत्येक बैच के लिए दोहराया जाना था। मुझे यकीन नहीं है कि इस प्रारंभिक प्रसंस्करण को कैसे संभाला जाए, लेकिन मैं इसे और अधिक विचार दूंगा। – jimbokun

0

लेन-देन के बारे में टाइमआउट जस्टिन द्वारा उल्लेख किया है, मैं हाल ही में समस्या कनेक्शन पूल (मेरे मामले में बिल्ला बिलाव 7 में DBCP) जिसमें, था सेटिंग जो चिह्नित करने के लिए लंबे समय से चल रहा है कनेक्शन का परित्याग चिह्नित की जाने वाली है और फिर उन्हें बंद चाहिए था का सामना करना पड़ा । उन मापदंडों को बदलने के बाद मैं उस मुद्दे से बच सकता था।

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

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