2016-10-07 12 views
6

समस्या:मैं com.mchange.v2.c3p0.ComboPooledDataSource से किसी विशिष्ट कनेक्शन का अनुरोध कैसे कर सकता हूं?

  • कार्यक्रम com.mchange.v2.c3p0.ComboPooledDataSource का उपयोग करता Sybase सर्वर से कनेक्ट करने
  • कार्यक्रम 2 तरीकों, runSQL1() और runSQL2(), अनुक्रम में कार्यान्वित
  • runSQL1() एसक्यूएल जो एक #temptable

    SELECT * INTO #myTemp FROM TABLE1 WHERE X=2 
    
  • बनाता है कार्यान्वित
  • runSQL2() एसक्यूएल निष्पादित करता है जो इस #tem से पढ़ता है ptable

    SELECT * FROM #myTemp WHERE Y=3 
    
  • समस्या: runSQL2()runSQL1() को सौंप दिया एक से पूल से एक अलग DB कनेक्शन सौंप दिया जाता है।

    हालांकि, Sybase #temptables कनेक्शन-विशिष्ट हैं, इसलिए runSQL2() विफल रहता है जब यह तालिका नहीं मिल पाती है।

सबसे स्पष्ट समाधान मैं के बारे में सोच सकते हैं (एक तरफ पूल आकार 1 बनाने का पतित है, जो बिंदु पर हम भी एक पूल की जरूरत नहीं है से), किसी भी तरह याद करने के लिए जो विशिष्ट पूल से कनेक्शन किया गया है runSQL1() द्वारा उपयोग किया गया है, और runSQL2() अनुरोध एक ही कनेक्शन है।

com.mchange.v2.c3p0.ComboPooledDataSource में ऐसा करने का कोई तरीका है?

यदि संभव हो, तो मुझे एक उत्तर चाहिए जो समवर्ती-सुरक्षित है (दूसरे शब्दों में, यदि runSQL1() में उपयोग किया जाने वाला कनेक्शन किसी अन्य थ्रेड द्वारा उपयोग किया जा रहा है, तो कनेक्शन प्राप्त करने के लिए runSQL2() की कॉल उस तक प्रतीक्षा करेगी कनेक्शन एक और थ्रेड द्वारा जारी किया जाता है)।

हालांकि, अगर यह असंभव है, तो मैं जवाब के साथ ठीक हूं, जो मानता है कि डीबी कनेक्शन (जिनकी मुझे परवाह है) सभी एक ही धागे में हो रहे हैं, और इसलिए runSQL2() द्वारा अनुरोध किया गया कोई भी कनेक्शन 100% उपलब्ध अगर यह runSQL1() के लिए उपलब्ध था।

मैं किसी अन्य समाधान का भी स्वागत करता हूं जो किसी अन्य तरीके से समस्या का समाधान करता है, जब तक कि वे समाधान के हिस्से के रूप में "#temptables का उपयोग करना बंद नहीं करते"।

+0

भाग 1 चलाने से पहले कनेक्शन का अनुरोध क्यों नहीं कर सकते हैं और फिर दोनों कॉलों के पैरामीटर के रूप में पास कर सकते हैं? – Ivan

+0

@ivan ने ऐसा किया। लेकिन मुझे इस समाधान को पसंद नहीं है इसलिए मैं जानना चाहता हूं कि – DVK

+1

के बजाय विशिष्ट कनेक्शन कैसे प्राप्त करें, मुझे यह भी लगता है कि @Ivan द्वारा प्रस्तावित समाधान उचित समाधान है। किसी भी अन्य तरीके से इसे प्राप्त करने के लिए, आपको कनेक्शन को कम से कम पहचानकर्ता को पकड़ने की आवश्यकता होती है जब आप इसे पहली बार प्राप्त करते हैं। ऐसा करने के बाद आपको पूल प्रबंधकों पर प्रतिबिंब का उपयोग करने और मिलान करने वाले कनेक्शन को खोजने की आवश्यकता है। ऐसा करने के बजाय केवल विशिष्ट कनेक्शन का संदर्भ रखना अधिक साफ है। यदि आपको वास्तव में पहचानकर्ता से पूछताछ करने की ज़रूरत है, तो आप अपना खुद का रैपर कनेक्शन प्रबंधक लिख सकते हैं और इसका उपयोग कर सकते हैं। – Kaan

उत्तर

0

ऐसा करने का सबसे आसान और सबसे स्पष्ट तरीका पूल से कनेक्शन का अनुरोध करना है और फिर उस कनेक्शन के साथ runSQL1() और runSQL2() चलाएं। प्रश्न में सुझाव दिया जा रहा पैटर्न पैटर्न कनेक्शन पूल प्रबंधकों के सामान्य डिजाइन सिद्धांतों के खिलाफ चला जाता है, क्योंकि यह प्रभावी रूप से उन्हें किसी प्रकार के लेनदेन प्रबंधक को बढ़ावा देगा।

जावा ढांचे हैं जो उपरोक्त में सहायता कर सकते हैं। उदाहरण के लिए वसंत @Transaction या TransactionTemplate में लेनदेन सीमाओं का आंकलन करने के लिए उपयोग किया जा सकता है और यह गारंटी देगा कि एकल कनेक्शन का उपयोग सिंगल थ्रेड (या अधिक सटीक रूप से, लेनदेन प्रचार एनोटेशन के अनुसार) द्वारा किया जाता है। वसंत कई लेनदेन प्रबंधकों का उपयोग कर सकता है, लेकिन शायद सबसे आसान DataSourceTransactionManager का उपयोग करना होगा और इसे c3p0DataSource के रूप में उपयोग करने के लिए भी कॉन्फ़िगर किया जा सकता है।

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