2010-02-18 12 views
11

मुझे यह पता लगाने की आवश्यकता है कि TAdoConnection घटक सर्वर के साथ कनेक्शन खो गया है। मैंने OnDisconnect ईवेंट का उपयोग करने का प्रयास किया है, लेकिन यह केवल तब बंद हो जाता है जब बंद विधि कहा जाता है या कनेक्ट की गई संपत्ति को गलत पर सेट किया जाता है।मैं कैसे पता लगा सकता हूं कि एक TadoConnection सर्वर के साथ संचार खो दिया?

एक अन्य विकल्प मैं कोशिश की है इस

SELECT 1 RESULT FROM DUAL 
OnTimer घटना में

की तरह एक TTimer एक प्रश्न उपयोग कर रहा है और क्रियान्वित करने, किसी भी अपवाद तब होता है कि पकड़ने।

क्या यह पता लगाने का एक बेहतर विकल्प है कि कनेक्शन खो गया था?

+2

एसक्यूएल सर्वर Qry.ExecSQL को SQL.Text = '' के साथ एक क्वेरी (लेकिन नहीं '' के रूप में अनुमति देता है)। इसे प्रति सेकंड सैकड़ों बार निष्पादित किया जा सकता है। –

उत्तर

11

मुझे डुएल तालिका दिखाई देती है। मतलब, आप ओरेकल का उपयोग कर रहे हैं :)

अधिकांश (सभी?) क्लाइंट/सर्वर डीबीएमएस के पास कुछ कार्रवाई के लिए डीबीएमएस से पूछने के अलावा, एक कनेक्शन खो गया है, यह पता लगाने का कोई तरीका नहीं है। और बहुत सारे कारण हैं, कनेक्शन क्यों खो गया है। नेटवर्क विफलता हो सकती है, हो सकता है ..., एक डीबीए एक डीबी बंद कर दिया जा सकता है।

ओरेकल ओसीआई समेत कई डीबीएमएस एपीआई में विशेष कार्य होते हैं, जो डीबीएमएस को पिंग करने की अनुमति देते हैं। "पिंग" डीबीएमएस के लिए सबसे छोटा संभव अनुरोध है। उपरोक्त चयन को इस तरह के पिंग की तुलना में अधिक नौकरी की आवश्यकता है।

लेकिन एडीओ समेत सभी डेटा एक्सेस घटकों को डीबीएमएस एपीआई पिंग कॉल का उपयोग करके डीबीएमएस पिंग करने की अनुमति नहीं है। फिर आपको कुछ एसक्यूएल कमांड का उपयोग करना होगा। तो, उपर्युक्त चयन एडीओ के साथ सही है। अन्य विकल्प - BEGIN न्यूल; समाप्त;। यह कम डीबीएमएस संसाधनों का उपयोग कर रहा है (अनुकूलक की कोई आवश्यकता नहीं है, परिणाम सेट का वर्णन करने की कोई आवश्यकता नहीं है, आदि)।

टीटीमर ठीक है। क्वेरी को थ्रेड में किया जाना चाहिए, जहां संबंधित कनेक्शन का उपयोग किया जाता है। हालांकि एक जरूरी नहीं है, लेकिन यह एक अलग मुद्दा है।

कनेक्शन बंद होने पर संभावित कनेक्शन एक कनेक्शन को बंद करने के लिए हो सकता है। एक कनेक्शन बंद होने के कारण डीबीएमएस एपीआई एक असफल स्थिति में हो सकता है क्योंकि अपवाद बढ़ा सकता है।

कि किस तरह ...

+1

हाय दा-मुलायम। यदि हम मुख्य धागे में TADOConnection का उपयोग करते हैं तो क्या हमें मुख्य धागे से एसक्यूएल "पिंग" करना चाहिए? क्या हमें एक ही टैडोकोनक्शन का उपयोग करना चाहिए या एक अलग "पिंग" TADOConnection का उपयोग करना चाहिए? – zig

3

@Dimitry जवाब बहुत अच्छा है। यदि आपके आवेदन के लिए यह महत्वपूर्ण है कि कनेक्टिनो खो गया है या नहीं, टीटीमर दृष्टिकोण (कम से कम opperation के साथ)।

यदि आप सिर्फ "खोने वाले संचार" के कारण कोई कथन विफल होने पर जानना चाहते हैं, तो आप एप्लिकेशन का उपयोग कर सकते हैं। अपवाद घटना और अपवाद गुणों का निरीक्षण करें।

मैंने एप्लिकेशन एवेन्ट्स घटक का उपयोग करके उदाहरण के रूप में निम्न कोड बनाया है। विचार के साथ सिर्फ एक मसौदा है, उत्पादन के लिए उपयुक्त नहीं है।

uses 
    ComObj; 

procedure TForm2.ApplicationEvents1Exception(Sender: TObject; E: Exception); 
var 
    EO: EOleException; 
begin 
    if E is EOLEException then 
    begin 
    EO := EOleException(E); 
    //connection error (disconnected) 
    if EO.ErrorCode = E_FAIL then 
    begin 
     try 
     try 
      ADOConnection1.Close; 
     except 
      ; 
     end; 
     ADOConnection1.Open; 
     ShowMessage('Database connection failed and re-established, please retry!'); 
     except 
     on E:Exception do 
      ShowMessageFmt('Database connection failed permanently. ' 
      + 'Please, retry later'#13'Error message: %s', [E.Message]); 
     end; 
    end 
    else 
     ShowMessage(E.Message + ' ' + IntToStr(EO.ErrorCode)); 
    end 
    else 
    ShowMessage(E.ClassName + #13 + E.Message); 
end; 

सर्वश्रेष्ठ संबंध।

-1

यह एडीओ छोड़ने और डीबीएक्स का उपयोग करने के कारणों में से एक है। एडो आर्किटेक्चर सर्वर कर्सर आधारित है और यह आवश्यक है कि किसी भी समय सर्वर से कनेक्शन खोना न पड़े। अगर कुछ परिस्थितियों में कनेक्शन गुम हो जाता है, तो कनेक्शन फिर से उठने में असमर्थ होगा। दूसरी ओर डीबीएक्स अपने डिस्कनेक्ट किए गए आर्किटेक्चर की वजह से हमेशा के लिए फिर से कनेक्ट करने में सक्षम है।

+0

यह सच नहीं है। एडीओ क्लाइंट कर्सर के रूप में सर्वर के रूप में उपयोग कर सकते हैं और डिस्कनेक्ट किए गए डेटासेट मॉडल को लागू करने की अनुमति देता है। About.com से: डिस्कनेक्ट किए गए एडीओ रिकॉर्डसेट को बनाने के लिए, आपको पहले ADODataSets CursorLocation प्रॉपर्टी को "clUseClient" पर सेट करना होगा। फिर रिकॉर्ड्स खोलें। फिर एडीओडासेट्स कनेक्शन को नील पर सेट करें। ADODataset को बंद न करें। –

+0

हां एडीओ ब्रीफ़केस मोड में काम कर सकता है। लेकिन इस मुद्दे पर डीबीएक्स की प्रतिक्रिया अधिक प्राकृतिक और अनुमानित है। –

0

मुझे कनेक्शन पूल पर एक ही समस्या है। मैंने थ्रेड डीबी कार्यों के लिए कनेक्शन का पुन: उपयोग करने में सहायता के लिए एक TADOSQLConnectionPool क्लास विकसित की है।जब मैं थ्रेड से कनेक्शन असाइन करना चाहता हूं तो मैंने न्यूनतम नौकरी चलाकर "1 का चयन करें" के रूप में इसका स्वास्थ्य जांचने की कोशिश की। इस तरह, मैं कनेक्शन के बारे में निश्चित रहूंगा। अगर यह विफल हो जाता है, तो मैं अगले अनुरोध पर सभी कनेक्शनों को फिर से बनाने के लिए निपटान कर दूंगा।

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