2009-07-30 12 views
13

मानक MySQL जेडीबीसी ड्राइवर थ्रेड-सुरक्षित है? विशेष रूप से मैं सभी धागे में एक कनेक्शन का उपयोग करना चाहता हूं, लेकिन प्रत्येक कथन का उपयोग केवल एक थ्रेड में किया जाएगा। क्या कुछ परिदृश्य सुरक्षित हैं और अन्य जो नहीं हैं? आपका अनुभव यहाँ क्या है?क्या MySQL कनेक्टर/जेडीबीसी थ्रेड सुरक्षित है?

+3

".. जबकि आप थ्रेड में कनेक्शन साझा करते हैं (विशेष रूप से यदि प्रत्येक थ्रेड का अपना स्टेटमेंट होता है), तो आमतौर पर यह एक अच्छा विचार नहीं है। जेडीबीसी एपीआई वास्तव में थ्रेड-सुरक्षित तरीके से उपयोग नहीं किया जाता है , और अधिकांश जेडीबीसी कनेक्शन (MySQL सहित) केवल एक ही समय में एक ही क्वेरी को संसाधित कर सकते हैं .. "http://forums.mysql.com/read.php?39,171022,171195#msg-171195 – Tim

+1

@Tim, हां, मैंने पहले पोस्ट देखा था। हालांकि यह किसी भी संभावित समस्या के बारे में जानकारी में नहीं जाता है, इसलिए मुझे लगा कि अन्य लोगों के अनुभवों के बारे में सुनना दिलचस्प होगा। साथ ही, मुझे लगा कि यह एक वैध सवाल है जो स्टैक ओवरफ़्लो प्रश्न डेटाबेस में था। उस लिंक को उत्तर के रूप में पोस्ट करने के लिए स्वतंत्र महसूस करें। :) –

+1

इसके बजाए एक कनेक्शन पूल का उपयोग करने पर विचार करें। –

उत्तर

8

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

+1

मुझे आश्चर्य है कि कोई संभावित उपयोग केस हो सकता है जहां आप किसी प्रकार का कांटा/एल्गोरिदम (सीएफ http://www.ibm.com/developerworks/java/library/j-jtp11137.html) में शामिल होना चाहते थे, लेकिन पूरी तरह से भीतर एक लेनदेन, तो आप एक कनेक्शन खोल सकते हैं और मूल धागे में लेनदेन शुरू कर सकते हैं, इसे सभी कार्य निष्पादकों को पास कर सकते हैं और फिर सभी शामिल होने के बाद मूल धागे में प्रतिबद्ध हो सकते हैं? –

+0

उदाहरण: 'लोड डेटा स्थानीय इन्फाइल' का उपयोग करके डेटा प्रविष्टि स्ट्रीमिंग, एक से अधिक तालिका में, जहां डेटा पर आपसी संबंध हैं, और सस्ती रूप से दो बार से अधिक बार फिर से नहीं किया जा सकता है। –

4

यदि autocommit = 1 है, तो यह बहुत ही व्यवहार्य है कि एकाधिक थ्रेड समान कनेक्शन साझा करते हैं, बशर्ते कनेक्शन तक पहुंच सिंक्रनाइज़ हो। यदि autocommit = 0 है, तो प्रतिबद्ध होने तक आपको किसी प्रकार के म्यूटेक्स के माध्यम से कनेक्शन तक पहुंच नियंत्रित करनी होगी।

जब तक आप अपने आवेदन के कनेक्शन की मात्रा में बिल्कुल सीमित नहीं हैं, तो एक कनेक्शन पूल अधिक व्यवहार्य विकल्प हो सकता है।

0

मेरे हाल के अनुभव के आधार पर, Connection ऑब्जेक्ट कनेक्टर/जे 5.1.33 में थ्रेड सुरक्षित नहीं है।

मैं bug 67760 में वर्णित एक डेडलॉक स्थिति में भाग गया हूं। यकीन है कि अगर ऐसा नहीं है यह एक बग है, लेकिन चर्चा से एक उचित सलाह था:

[12 दिसंबर 2012 20:33] टोड किसान

कृपया अधिक थ्रेड में एक ही कनेक्शन वस्तु का उपयोग नहीं करते के बिना उचित सिंक्रनाइज़ेशन। कनेक्टर/जे - और अधिक महत्वपूर्ण बात, MySQL क्लाइंट-सर्वर प्रोटोकॉल - समान कनेक्शन ऑब्जेक्ट का उपयोग कर समवर्ती संचालन के लिए अनुमति नहीं देता है। यदि कनेक्शन ऑब्जेक्ट को थ्रेड में साझा किया जाना चाहिए, तो यह सुनिश्चित करने के लिए एप्लिकेशन कोड लेखक की ज़िम्मेदारी है कि संचालन उचित रूप से क्रमबद्ध हो।

+0

एफवाईआई, वह बग अब 5.1.37 में तय किया गया है। – Archie