हमारे पास कुछ क्लाइंट कोड है जो SQL सर्वर सर्वर से बात करने के लिए .NET में SqlConnection क्लास का उपयोग कर रहा है। यह रुक-रुक कर इस त्रुटि के साथ विफल हो रहा है:.NET SqlConnection वर्ग, कनेक्शन पूलिंग और पुन: कनेक्शन तर्क
"ExecuteReader एक खुली और उपलब्ध कनेक्शन की आवश्यकता है कनेक्शन के वर्तमान स्थिति के बंद रहता है।"
"अस्थायी" समाधान प्रक्रिया है, जिसके बाद सब कुछ काम करता है रिबूट करने के लिए है - हालांकि, यह स्पष्ट रूप से असंतोषजनक है।
कोड प्रत्येक डेटाबेस के लिए SqlConnection उदाहरणों का एक कैश रख रहा है।
हम कोड को फिर से लिखना है, लेकिन इससे पहले कि मैं करते हैं, मैं कुछ चीजें जानने की जरूरत करना चाहते हैं:
मेरा पहला सवाल यह है: यह कनेक्ट और SqlConnection वस्तुओं डिस्कनेक्ट बार-बार करने के लिए अक्षम है, या क्या करता है अंतर्निहित लाइब्रेरी हमारी तरफ से कनेक्शन पूलिंग करती है?
// Is this bad/inefficient?
for(many-times)
{
using(SQLConnection conn = new SQLConnection(connectionString))
{
// do stuff with conn
}
}
क्योंकि हमारे कोड नहीं ऊपर क्या करता है, क्या लगता है इस समस्या का संभावित कारण है कि कुछ कनेक्शन है कि कनेक्शन का कारण बनता है की "जीवनकाल" के दौरान अंतर्निहित SQLServer डेटाबेस के लिए होता को बंद करना पड़ा है ...
यदि यह पता चला है कि यह "कैश" एसक्यूएलकनेक्शन ऑब्जेक्ट्स के लिए योग्य है, तो सभी त्रुटियों को संभालने का अनुशंसित तरीका क्या है जिसे डेटाबेस में "रीकनेक्ट" करके हल किया जा सकता है। मैं इस तरह के रूप परिदृश्यों के बारे में बात कर रहा हूँ:
- डेटाबेस ऑफ़लाइन लिया और ऑनलाइन वापस लाया जाता है, लेकिन ग्राहक प्रक्रिया कोई खुला लेनदेन था, जबकि इस
- हो रहा था डेटाबेस "कट" था, तो "पुन: कनेक्ट "
मुझे लगता है कि एसक्यूएलकनेक्शन पर एक" राज्य "संपत्ति है ... क्या यह पूछने का कोई उचित तरीका है?
अंत में, मैं एक परीक्षण SQLServer उदाहरण पूर्ण पहुँच अधिकार के साथ सेट अप है: कैसे मैं सटीक त्रुटि से उत्पन्न होने के बारे में जा सकते हैं "। ExecuteReader एक खुली और उपलब्ध कनेक्शन की आवश्यकता है कनेक्शन के वर्तमान स्थिति बंद है"
जो मैं सुनने की उम्मीद कर रहा था ... इस बारे में कोई विचार कि मैं सही त्रुटि को कैसे पुन: उत्पन्न कर सकता हूं? (बस "सिद्ध" करने के लिए कि मैंने समस्या तय की है)? –
ईमानदार होने के लिए कहना मुश्किल है। यदि आप एकाधिक धागे से एक ही कनेक्शन का उपयोग करने की कोशिश कर रहे हैं, तो यह आसानी से दौड़ की स्थिति हो सकती है। –
कनेक्शन पूलिंग को अक्षम करने के लिए: "पूलिंग = गलत" जोड़ें; कनेक्शन स्ट्रिंग के लिए। – Richard