2009-10-07 11 views

उत्तर

55

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

आपको यह सुनिश्चित करने के लिए एक कनेक्शन पूल (Apache Commons DBCP) का उपयोग करना चाहिए ताकि प्रत्येक धागे का अपना कनेक्शन हो।

+4

उदाहरण Postgres के कार्यान्वयन autoCommit ध्वज के लिए उपयोग समन्वयित नहीं होती तो यह थ्रेड-सुरक्षित नहीं है के लिए। –

+1

मेरे सिर के पीछे एक आवाज मुझे बता रही है कि जेडीबीसी स्पेक को सभी java.sql ऑब्जेक्ट्स को थ्रेड-सुरक्षित होने की आवश्यकता है, लेकिन मुझे इसका संदर्भ नहीं मिल रहा है। – skaffman

+11

आपकी आवाज http://java.sun.com/j2se/1.3/docs/guide/jdbc/spec/jdbc-spec.frame9.html का संदर्भ दे सकती है जहां यह कहता है "हमें सभी java.sql पर सभी परिचालनों की आवश्यकता है ऑब्जेक्ट मल्टी-थ्रेड सुरक्षित और एक ही ऑब्जेक्ट को एक साथ कॉल करने के साथ-साथ कई धागे होने के साथ सही ढंग से सामना करने में सक्षम होते हैं। " – janko

9

java.sql.Connection एक इंटरफ़ेस है। इसलिए, यह सब ड्राइवर के कार्यान्वयन पर निर्भर करता है, लेकिन सामान्य रूप से आपको अलग-अलग धागे के बीच समान कनेक्शन साझा करने और कनेक्शन पूल का उपयोग करने से बचना चाहिए। साथ ही यह सलाह दी जाती है कि पूल में कार्यकर्ता धागे की संख्या से अधिक कनेक्शन हो।

+7

एक इंटरफेस एक अनुबंध है, और एक अनुबंध * * निर्दिष्ट कर सकता है कि सभी कार्यान्वयन थ्रेड सुरक्षित होना चाहिए। यह सिर्फ यह है कि java.sql.Connection के लिए यह मामला नहीं है। –

+1

हां, इंटरफेस एक अनुबंध है और आप दस्तावेज में कुछ अतिरिक्त आवश्यकताएं डाल सकते हैं जो अनुबंध का वर्णन करते हैं, लेकिन जैसा कि आपने कहा है java.sql.Connection दस्तावेज थ्रेड-सुरक्षा आवश्यकता को परिभाषित नहीं करता है, और यहां तक ​​कि यदि यह परिभाषित किया गया है, तब भी थ्रेड- सुरक्षा ऐसी चीज नहीं है जिसे सख्ती से वर्णित और लागू किया जा सके। कार्यान्वयन अभी भी अनुबंध का उल्लंघन कर सकता है (कभी-कभी गलती से, कभी-कभी डिज़ाइन द्वारा पहचान पहचान हैशैप मैप)। –

+0

@AndreyAdamovich: "सलाह दी जाती है कि पूल में कार्यकर्ता धागे की संख्या से अधिक कनेक्शन हो" क्यों? मेरा मतलब है कि अगर मेरे पास कनेक्शन पूल में कई कनेक्शन हैं तो मैं थ्रैशिंग की समस्या के साथ समाप्त हो जाऊंगा .. –

0

हमारे पास इसके पूलडिएटसोर्स के वेबस्पेयर स्टेटमेंट कैश पर ArrayOutOfBoundsException था, और हमें उस कैश को अक्षम करना पड़ा।

हमारे पास एक ऐसा उपचार था जो खुद को अवरुद्ध कर रहा था।

यह सब कनेक्शन की वर्तमान पहुंच के कारण, वास्तविक जीवन अभ्यास द्वारा निष्कर्ष यह है कि आपको ऐसा नहीं करना चाहिए।

1

यह नहीं बल्कि एक पुराने धागा है, लेकिन जो Microsoft SQL सर्वर के बारे में जवाब के लिए देख रहे हैं उन लोगों के लिए, यहाँ जवाब है:

SQLServerConnection सुरक्षित थ्रेड नहीं है, एक भी कनेक्शन से बनाए गए लेकिन कई बयान समवर्ती धागे में एक साथ प्रसंस्करण हो सकता है।

और

SQLServerConnection एसक्यूएल सर्वर के लिए एक JDBC कनेक्शन लागू करता है।

सब से ऊपर से, आप बयानों लेकिन कनेक्शन नहीं साझा कर सकते हैं, और मामले में आप प्रत्येक थ्रेड में एक कनेक्शन की आवश्यकता है, तो आप एक धागा पूल का उपयोग कर सकते हैं।

और पढ़ें here