2009-07-20 11 views
14

मैं ASP.Net वेबसाइटों (नेट v3.5) एक एसक्यूएल 2000 डेटाबेस बैकेंड के साथ एक सर्वर पर चल के एक नंबर मिल गया है का कारण बनता है। कई महीनों के लिए, मुझे "आंतरिक कनेक्शन घातक त्रुटि" संदेश के साथ यादृच्छिक अमान्यऑपरेशन अपवाद प्राप्त हो रहा है। कभी-कभी इसमें कुछ दिन होते हैं, जबकि दूसरी बार प्रति दिन कई त्रुटियां होती हैं।क्या "आंतरिक कनेक्शन घातक त्रुटियों"

अपवाद, विशेष रूप से एक साइट तक सीमित नहीं है वे व्यापार और डेटा का उपयोग विधानसभाओं होती हैं। त्रुटि हमेशा SqlClient.TdsParser.Run() से फेंक दी जाती है। इसे कभी-कभी पुराने स्कूल के सीधे SqlCommand.Execute() कॉल से फेंक दिया जाता है, जबकि अन्य बार इसे Linq2Sql कोड से फेंक दिया जाता है।

मैं नेटवर्क लोगों ने आश्वासन दिया गया है कोई त्रुटि या पैकेट उनके अंत पर खो रहे हैं। क्या किसी और को भी इसका अनुभव हुआ है? क्या यह ड्राइवर समस्या हो सकती है? हम अभी तक इस अपवाद के लिए एक विशिष्ट ट्रिगर को इंगित करने में असमर्थ रहे हैं।

हम विंडोज सर्वर पर II6 चला रहे हैं 2003

उत्तर

21

इस मुद्दे की अनदेखी के कुछ महीनों के बाद, यह यातायात के रूप में एक अहम धीरे-धीरे वृद्धि हुई तक पहुँचने के लिए शुरू कर दिया। भारी भार के तहत, कुछ क्रॉलर समेत, चीजें पागल हो गईं और इन त्रुटियों को नॉनस्टॉप में डाला गया।

परीक्षण और त्रुटि के माध्यम से, हम अंततः SqlCommand या LINQ प्रश्नों जिसका SqlConnection उपयोग के बाद तुरंत बंद नहीं किया गया था के एक मुट्ठी भर नीचे ट्रैक किए गए। इसके बजाय, कुछ लापरवाह प्रोग्रामिंग LINQ कनेक्शन की एक गलतफहमी से होने वाले के माध्यम से, DataContext वस्तुओं केवल बजाय तुरंत एक अनुरोध के अंत में निपटाया गया (और कनेक्शन बंद)।

एक बार जब हमने सी # "उपयोग" ब्लॉक (अगले अनुरोध के लिए उस पूल को मुक्त करने) के साथ कनेक्शन को तुरंत बंद करने के लिए इन विधियों को दोबारा दोहराया, तो हमें और त्रुटियां नहीं मिलीं। हालांकि हम अभी भी अंतर्निहित कारण नहीं जानते हैं कि एक कनेक्शन पूल इतना मिश्रित हो जाएगा, हम इस प्रकार की सभी त्रुटियों को समाप्त करने में सक्षम थे। इस समस्या को मैंने पोस्ट की गई एक और समान त्रुटि के साथ हल किया था, यहां पाया गया: Why is my SqlCommand returning a string when it should be an int?

1

(\ Program Files \ Microsoft SQL सर्वर \ MSSQL.1 \ MSSQL \ LOG या समान) नाम दिया फ़ाइलों के लिए अपने सर्वर का लॉग फ़ोल्डर की जाँच करें SqlDump * .mdmp और SqlDump * .txt। यदि आपको कोई मिलता है तो आपको इसे उत्पाद समर्थन में ले जाना होगा।

1

डेटाबेस कनेक्शन की तरह लगता है कि गिरावट या समय समाप्त हो रहा है।

हमने हाल ही में आईआईएस 5 से आईआईएस 6 में जाने इसी तरह के मुद्दों एसक्यूएल 2000 से कनेक्ट करने के हमारे मुद्दे अल्पकालिक उपलब्ध बंदरगाहों की संख्या में वृद्धि से हल किया गया था।

आईआईएस सर्वर द्वारा तात्कालिक बंदरगाहों के उपयोग को देखें। डिफ़ॉल्ट अधिकतम संख्या। बंदरगाहों का सामान्य रूप से 4000 होता है। यदि आप अपने सर्वर की साइटें विशेष रूप से व्यस्त हैं या आपका एप्लिकेशन बहुत सारे डेटाबेस कॉल कर रहा है तो आप इसे बढ़ाने पर विचार करना चाहेंगे।

अधिकतम सीमा से अधिक होने पर आप इन पहली बार निगरानी कर सकते हैं। "यदि MaxUserPort" और "TcpTimedWaitDelay" के लिए

खोजें माइक्रोसॉफ्ट ज्ञान और आवश्यक रजिस्ट्री परिवर्तन करें। परिवर्तन करने से पहले सुनिश्चित करें कि आप रजिस्ट्री या स्नैपशॉट सर्वर का बैकअप लें। परिवर्तनों को प्रभावी होने के लिए रीबूट करने की आवश्यकता होगी।

आपको अपने डेटाबेस को दोबारा जांचना चाहिए और उपयोग के बाद रिकॉर्डसेट कनेक्शन बंद कर दिया जाना चाहिए। बंद नहीं करना इस बंदरगाह सीमा को अनावश्यक रूप से उपयोग करेगा।

अपनी संग्रहीत प्रक्रियाओं की दक्षता की जांच करें, वैसे भी जैसे उन्हें अधिक से अधिक समय लेना पड़ सकता है।

"यदि आप चार मिनट से भी कम समय में 4000 सॉकेट को तेज़ी से खोलते और बंद करते हैं, तो आप क्लाइंट अज्ञात बंदरगाहों के लिए डिफ़ॉल्ट अधिकतम सेटिंग तक पहुंच जाएंगे, और नए सॉकेट कनेक्शन प्रयास तब तक विफल हो जाएंगे जब तक कि TIME_WAIT सॉकेट के मौजूदा सेट का समय समाप्त न हो जाए।" - से http://support.microsoft.com/kb/328476

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