2012-05-25 27 views
7

इस एडीओ त्रुटि संदेश को गुगल करने से संकेत मिलता है कि यह आमतौर पर एएसपी.नेट विकास में सामना किया जाता है, लेकिन मुझे डेल्फी अनुप्रयोगों में होने पर बहुत अधिक उल्लेख नहीं मिला है। हमारे पास कुछ ग्राहक साइटें हैं जो क्षणिक नेटवर्क समस्याओं का सामना कर रही हैं, और यह लक्षण त्रुटि संदेश है। हम आसानी से कार्यालय परीक्षण में डुप्लिकेट कर सकते हैं; बस एक एमएस एसक्यूएल सर्वर सेवा बंद करते समय अपने डेल्फी TADOConnection उद्देश्य यह है कि सर्वर उदाहरण पर एक डेटाबेस से जुड़ा है और आप इस अपवाद: (? या आप करते हैं)डीबीएनईटीआईएल कनेक्शन कब ऑटो-रिकवर करें सामान्य नेटवर्क त्रुटि एडीओ कनेक्शन डेल्फी अनुप्रयोगों में ऑफ़लाइन जाने का कारण बनती है?

[DBNETLIB][ConnectionWrite (send()).]General network error. Check your network documentation. 

हाँ, यह अपवाद को पकड़ने, और आप जानते कि यह त्रुटि हुई है। सिवाय इसके कि यह 10,000 केएलओसी + एप्लिकेशन है जिसमें 10,000 से अधिक प्रयास-डेटाबेस क्रियाओं के आसपास ब्लॉक को छोड़कर, इनमें से कोई भी इस त्रुटि से असफल हो सकता है।

TADOConnection में कुछ त्रुटि घटनाएं हैं, जिनमें से कोई भी इस मामले में आग नहीं है। हालांकि, ऐसा होने पर एडीओ कनेक्शन स्वयं ही गलती हो जाती है, भले ही आप SQL डेटाबेस को पुनरारंभ करें, TADOConnection.Connected सत्य बनी हुई है, लेकिन यह आपके लिए झूठ बोल रही है। यह वास्तव में एक दोषपूर्ण राज्य में है।

तो फिर, मेरे सवाल यह है:

आप किसी भी तरह से है कि ब्लॉक को छोड़कर कोशिश 10,000 व्यक्ति में जा रहा है और कुछ वैश्विक स्थापित करने की तुलना में कम काम में इस गलती राज्य का पता लगाने, और यह से उबरने कर सकते हैं, "एडीओ ग्लोबल वैरिएबल पुनः कनेक्ट करें"?

मैं आशा करता हूं वहाँ, TADOConnection.ConnectionObject (अपरिष्कृत OLEDB कॉम ADO ऑब्जेक्ट) में जाने और इस गलती हालत मौजूद है जब हम एक नई क्वेरी शुरू कर रहे हैं पता लगाने के लिए, ताकि हम ADOConnection रीसेट और जारी रख सकते हैं एक तरीका है अगली बार जब हम एक क्वेरी चलाते हैं। चूंकि हमारा कोड इस तरह से व्यवस्थित किया गया है कि हमें "विफलता के बाद" इसे आसानी से पहचानने की इजाजत मिलेगी, इससे हमें 10 लाइन डेमो एप्लिकेशन में ऐसा करने की अनुमति मिल जाएगी।

This other SO question पूछता क्यों ऐसा होता है, कि नहीं क्या मैं पूछ रहा हूँ, कृपया मुझे देना नहीं है "रोकथाम" जवाब है, मैं उनके बारे में पहले से ही पता है, मैं एक वसूली और पहचान के- के लिए देख रहा हूँ अपवादों को पकड़ने के अलावा अन्य स्टॉल-एडीओ-कनेक्शन तकनीक। वास्तव में, यह अपवादों का गलत उदाहरण है; एडीओ इस विफलता मोड में एक schrodingers-cat वस्तु है।

मुझे एमएस नॉलेजबेस लेखों और इंटरनेट के चारों ओर तैरने वाले विभिन्न समाधानों से अवगत है। एक बार त्रुटि की स्थिति (जो अक्सर हमारी परिस्थितियों में क्षणिक होती है) को मंजूरी मिलने के बाद, मैं ग्राहक डेटा खोने के बिना रिकॉर्वरिंग के बारे में पूछ रहा हूं। इसका मतलब है कि हम अपने ऐप को फ्रीज करते हैं, ग्राहक को अपवाद दिखाते हैं, और जब ग्राहक पुनः प्रयास या जारी करते हैं, तो हम मरम्मत और जारी रखने का प्रयास करते हैं। ध्यान दें कि हमारा मौजूदा कोड लाखों प्रयास-को-लॉग-एंड-जारी कोड करता है, जो हमारे रास्ते में जा रहा है, इसलिए मैं किसी से यह जवाब देने की उम्मीद कर रहा हूं कि अनचाहे अपवादों के लिए एक एप्लिकेशन हैंडलर सबसे अच्छा तरीका है, लेकिन दुख की बात है हम इसका इस्तेमाल नहीं कर सकते। मुझे उम्मीद है कि हालांकि एक जमे हुए/दोषग्रस्त/मृत एडीओ कनेक्शन ऑब्जेक्ट का पता लगाना संभव है।

यहाँ मैं क्या है:

try 
    if fQueryEnable and ADOConnection1.Connected then begin 
    qQueryTest1.Active := false; 
    qQueryTest1.Active := true; 
    Inc(FQryCounter); 
    Label2.Caption := IntToStr(qQueryTest1.RecordCount)+' records'; 

    end; 
except 
     on E:Exception do begin 
     fQueryEnable := false; 
     Memo1.Lines.Add(E.ClassName+' '+E.Message); 
     if E is EOleException and Pos('DBNETLIB',E.Message)>0 then begin 
      ADOConnectionFaulted := boolean; { Global variable. } 
     end; 
     raise; 
     end; 
end; 

ऊपर समाधान के साथ समस्या यह है कि मैं अपने आवेदन में कॉपी और लगभग 10,000 स्थानों पेस्ट करना है।

+0

कुछ एक TTimer और चयन @@ संस्करण और वैश्विक राज्य चर की तरह एक साधारण क्वेरी की तरह? – whosrdaddy

+0

कभी भी इस समस्या का सामना नहीं करना पड़ा क्योंकि मैंने अपने सभी ऐप्स के लिए एक रैपर बनाया है जो इस तरह की स्थितियों को संभालता है। यदि आपको 10k स्थानों को बदलने की ज़रूरत है तो किंडा बेकार है :( – whosrdaddy

+0

हाँ, एक "एडीओ वॉचडॉग" और फिर भी एक और बुरा टीटीमर। :-) –

उत्तर

8

अच्छी तरह से किसी ने भी इस प्रश्न का उत्तर नहीं दिया है, और मुझे लगता है कि कुछ अनुवर्ती मददगार होंगे।

यहाँ मैं क्या सीखा है है:

  • कोई विश्वसनीय स्थितियों में, जहां एक परीक्षण वातावरण में आप इस जनरल नेटवर्क त्रुटि पुन: पेश कर सकते हैं। ऐसा कहने के लिए, हम इर्रेप्रॉडसीबल परिणाम से निपट रहे हैं, जहां कई डेवलपर्स अपने टूटे हुए सिस्टमों को "बंदरगाह" करने के प्रयास में बुराई हैकर में छलांग लगाते हैं।

  • अंतर्निहित गलती को ठीक करना हमेशा कोड में इसे ठीक करने से बेहतर होता है, जब SQL लाइब्रेरी "सामान्य नेटवर्क त्रुटि" देती है। कोई मरम्मत कभी, संभव के रूप में दिखाया गया है, क्योंकि आम तौर पर इसका मतलब है "नेटवर्क इतना अविश्वसनीय है कि टीसीपी ही अपने डेटा देने पर छोड़ दिया है कि", ऐसा होता है जब:

    • आप खराब नेटवर्क केबल है।

    • आपके पास नेटवर्क पर डुप्लिकेट आईपी पते हैं।

    • आपने प्रत्येक डिफ़ॉल्ट गेटवे को अलग करने वाले डीएचसीपी सर्वरों को डुप्लिकेट किया है।

    • आपके पास स्थानीय ईथरनेट सेगमेंट हैं जिनके बीच खराब कनेक्टिविटी है।

    • आपके पास एक ईथरनेट स्विच या हब है जो असफल रहा है।

    • आपको एक खराब फ़ायरवॉल द्वारा अंतःस्थापित अवरुद्ध किया जा रहा है।

    • आपके ग्राहक ने अपने नेटवर्क पर कुछ बदल दिया होगा, और अब आपके सॉफ़्टवेयर का उपयोग करने में असमर्थ हो सकता है। (यह पिछले एक वास्तव में एक से अधिक आप सोच सकते हैं होता है)

    • किसी व्यक्ति ने एक एसक्यूएल उर्फ ​​cliconfg या अन्य ग्राहक के पक्ष विन्यास तत्वों है कि एक ही कार्य केंद्र की रजिस्ट्री सेटिंग्स के लिए विशिष्ट हैं, का उपयोग करते हुए और यह स्थानीय विन्यास कॉन्फ़िगर किया गया हो सकता है बुरा में हो सकता है व्यवहार जो निदान करना मुश्किल है और एक बड़े नेटवर्क पर एक या कई वर्कस्टेशन तक ही सीमित हो सकता है। की

कोई भी ऊपर पता लगाया जा सकता है और या तो टीसीपी या SQL स्तर पर सूचना दी। जब एसक्यूएल अंततः छोड़ देता है, और यह "सामान्य नेटवर्क त्रुटि" देता है, तो मेरे सॉफ़्टवेयर से कोई भी कैजोलिंग इसे गैर-देने के लिए नहीं जा रहा है, और यहां तक ​​कि अगर ऐसा होता है, तो भी मैं "कोशिश/छोड़कर" कोशिश करता/करती हूं/अनदेखा "antipattern। यह त्रुटि इतनी गंभीर है कि हमें इसे उपयोगकर्ता तक सभी तरह से उठाया जाना चाहिए, त्रुटि लॉग में डिस्क पर लॉग इन करना, प्रोग्राम छोड़ना (प्रोग्राम छोड़ना), और उपयोगकर्ता को बताएं कि नेटवर्क कनेक्शन डाउन है।

+1

यह एक और स्थान जहां ऐसा होता है जहां विंडोज़ में स्थानीय क्षेत्र नेटवर्क में एक कंप्यूटर पर टीसीपी/आईपी वी 4 और टीसीपी/आईपी वी 6 दोनों सक्षम हैं, और नेटवर्क के दूसरी तरफ आईपी वी 6 सक्षम नहीं है, और फिर भी किसी भी तरह से एलएलएमएनआर या विंडोज़ में कुछ और अभी भी कोशिश करता है आईपी ​​वी 6 का उपयोग करें जब इसे नहीं करना चाहिए। अजीबता आती है। –

+0

+1। ध्यान दें कि मोबाइल दुनिया में स्वचालित रूप से पुनः प्रयास करने के लिए यह अधिक आम है (आमतौर पर एक घातीय बैकऑफ का उपयोग करके: https://www.google.com/search?q=connection+retry+algorithm) क्योंकि वायरलेस नेटवर्क (वाईफाई, जी 3, बीटी) इतने अविश्वसनीय हैं। लेकिन दोनों वातावरण में अंततः आपको एक उपयोगकर्ता से पूछना है कि क्या करना है (यदि यह सर्वर प्रक्रिया नहीं है)। –

+0

वास्तव में यहां देर से टिप्पणी की गई है, लेकिन [यह उत्तर] (http://stackoverflow.com/questions/3211625/general-network-error-after-a-night-of-inactivity/3211950#3211950) दोहराने का एक संभावित तरीका बताता है यह गलती। यद्यपि उन चरणों को किसी भी वास्तविक अनुप्रयोग में किसी भी तरह के डिबगिंग ब्रेकपॉइंट पर रोकने के लिए मजबूर किए बिना किसी भी वास्तविक अनुप्रयोग में पालन करना बहुत मुश्किल होगा, क्योंकि "डीबी कनेक्शन खोलें" और "डीबी कनेक्शन का उपयोग" के बीच का समय आमतौर पर लगभग तात्कालिक होगा। – jadarnel27

2

मुझे बुरा कोडिंग भी की वजह से हो रहा देखा है ..

आप एक कनेक्शन का उपयोग कर एक recordset खोल सकते हैं और यदि आप पुन: उपयोग है कि एक और recordset के लिए एक पाश में एक ही कनेक्शन है, जबकि पहले कनेक्शन तो है कि बंद कर दिया नहीं है, तो समान त्रुटियों का कारण बन सकता है।

वेब अनुप्रयोगों पर बहुत ही कम अवसर एक अन्य अवसर है जबकि एप्लिकेशन पूल रीसाइक्लिंग है, आपको समान त्रुटि मिल सकती है।

हमारे पास एक ही सर्वर में अलग-अलग साइटें हैं जहां मैंने देखा है कि एक ही एप्लिकेशन के साथ लेकिन विभिन्न अनुकूलन के साथ, केवल एक साइट ही इस समस्या का कारण बन रही है। इससे उपर्युक्त निष्कर्ष निकलते हैं।

इस ब्लॉग मुझे मदद की समस्याओं का पता लगाने के लिए:

http://offbeatmammal.hubpages.com/hub/Optimising_SQL_Server

+0

यह थ्रेड के बीच खराब/अबाध वस्तु-साझाकरण से संभावित परिणाम के एक सुंदर "यादृच्छिक" प्रकार की तरह लगता है –