समस्या:मैं com.mchange.v2.c3p0.ComboPooledDataSource से किसी विशिष्ट कनेक्शन का अनुरोध कैसे कर सकता हूं?
- कार्यक्रम
com.mchange.v2.c3p0.ComboPooledDataSource
का उपयोग करता Sybase सर्वर से कनेक्ट करने - कार्यक्रम 2 तरीकों,
runSQL1()
औरrunSQL2()
, अनुक्रम में कार्यान्वित runSQL1()
एसक्यूएल जो एक #temptableSELECT * INTO #myTemp FROM TABLE1 WHERE X=2
बनाता है कार्यान्वित
runSQL2()
एसक्यूएल निष्पादित करता है जो इस #tem से पढ़ता है ptableSELECT * 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 का उपयोग करना बंद नहीं करते"।
भाग 1 चलाने से पहले कनेक्शन का अनुरोध क्यों नहीं कर सकते हैं और फिर दोनों कॉलों के पैरामीटर के रूप में पास कर सकते हैं? – Ivan
@ivan ने ऐसा किया। लेकिन मुझे इस समाधान को पसंद नहीं है इसलिए मैं जानना चाहता हूं कि – DVK
के बजाय विशिष्ट कनेक्शन कैसे प्राप्त करें, मुझे यह भी लगता है कि @Ivan द्वारा प्रस्तावित समाधान उचित समाधान है। किसी भी अन्य तरीके से इसे प्राप्त करने के लिए, आपको कनेक्शन को कम से कम पहचानकर्ता को पकड़ने की आवश्यकता होती है जब आप इसे पहली बार प्राप्त करते हैं। ऐसा करने के बाद आपको पूल प्रबंधकों पर प्रतिबिंब का उपयोग करने और मिलान करने वाले कनेक्शन को खोजने की आवश्यकता है। ऐसा करने के बजाय केवल विशिष्ट कनेक्शन का संदर्भ रखना अधिक साफ है। यदि आपको वास्तव में पहचानकर्ता से पूछताछ करने की ज़रूरत है, तो आप अपना खुद का रैपर कनेक्शन प्रबंधक लिख सकते हैं और इसका उपयोग कर सकते हैं। – Kaan