2010-07-16 11 views
6

मैंने एक टीसीपीआईपी सर्वर एप्लिकेशन बनाया है। आवेदन में एक वैश्विक TADOConnection है। यह वैश्विक एडीओ कनेक्शन मुख्य थ्रेड प्रश्नों के लिए और थ्रेडेड प्रक्रियाओं के भीतर भी प्रयोग किया जाता है।थ्रेड में TADOConnection का उपयोग करने के लिए ठीक है

क्या यह ठीक है? क्या ADOConnection ने एक ही समय में कई प्रश्नों को संभालने के लिए तंत्र में बनाया है?

मेरा एप्लिकेशन परीक्षण वातावरण (2-5 कनेक्शन) में ढूंढता है। लेकिन एक उत्पादन वातावरण में तैनात किया गया है, मुझे उस बिंदु पर "अप्रत्याशित" पहुंच उल्लंघन मिल रहा है, जो ADOConnection से जुड़े TADOQuery को खोला गया है।

क्या मुझे एडीकॉन्क्शन का उपयोग करना चाहिए या क्या सभी प्रश्नों को डेटाबेस से कनेक्शन बनाना चाहिए (जो शायद थोड़ा अधिक संसाधन महंगा है)?

+2

http://stackoverflow.com/questions/1241844/is-delphis-tadoconnection-thread-safe – jasonpenny

+1

संसाधन उपयोग और कनेक्शन प्रारंभिक समय का डुप्लिकेट कनेक्शन कनेक्शन का उपयोग करके बेहतर किया जा सकता है। उदाहरण के लिए http://otl.17slon.com/ – mjn

+0

पर OmniThreadLibrary (डेल्फी 2007 या नए की आवश्यकता है) में डेमो एप्लिकेशन (ओं) के आधार पर धन्यवाद - यह जांच जाएगा। लेकिन सबसे पहले मुझे बात मिल जाएगी- फिर प्रदर्शन के बारे में चिंता कर सकते हैं। –

उत्तर

8

प्रत्येक धागा अपनी ही कनेक्शन वस्तु की जरूरत है देखते हैं। नीचे दिए गए लिंक में अधिक जानकारी प्रदान करता है: http://delphi.about.com/od/kbthread/a/query_threading.htm

लेख से कुछ प्रमुख बिंदु:

1] CoInitialize और CoUninitialize dbGo वस्तुओं के किसी भी उपयोग करने से पहले मैन्युअल रूप से बुलाया जाना चाहिए। CoInitialize को कॉल करने में विफल होने के परिणामस्वरूप "CoInitialize को" अपवाद नहीं कहा गया था। CoInitialize विधि वर्तमान थ्रेड पर COM लाइब्रेरी को प्रारंभ करता है। एडीओ COM है।

2] आप मुख्य थ्रेड (एप्लिकेशन) से TADOConnection ऑब्जेक्ट का उपयोग नहीं कर सकते हैं। प्रत्येक धागे को अपना डेटाबेस कनेक्शन बनाना होगा।

+0

धन्यवाद। और मुझे लगता है कि मैंने भी इस लेख को पढ़ा होगा। मैं इसे फिर से लिखने पर काम करूंगा। हालांकि एक बात यह है कि: मुझे कभी भी "सिक्का शुरू नहीं किया गया" अपवाद नहीं मिला है। इसके बजाय मुझे केवल उल्लंघन उल्लंघन मिल रहा है। क्या यह अपवाद "चुप" हो सकता है? –

+0

इस पर फ़ॉलो करें। क्या एप्लिकेशन तब तक "ठीक" चलाएगा जब तक कि दो प्रश्न कभी एक ही समय में नहीं किए जाते? और एक साथ कनेक्शन के समय केवल दुर्घटना? –

+0

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

7

@ एम शेन्केल, यह प्रश्न Is Delphi’s TADOConnection thread-safe? देखें। प्रत्येक थ्रेड को अपने कनेक्शन की आवश्यकता होती है क्योंकि एडीओ एक COM- आधारित तकनीक है और यह अपार्टमेंट-थ्रेडेड ऑब्जेक्ट्स का उपयोग करता है।

इस नमूने

procedure TMyThread.Execute; 
begin 
    CoInitialize(nil); 
    try 
    try 
     // create a connection here 
    except 
    end; 
    finally 
    CoUnInitialize; 
    end; 
end; 
+0

बहुत बहुत धन्यवाद। ऐसा प्रतीत होता है कि आप और विक एडम्स अनिवार्य रूप से एक ही समय में एक ही जवाब लिख रहे थे। क्योंकि वोटों को "साझा करने" का कोई तरीका नहीं है, मैंने सोचा कि वोट (केवल 31 प्रतिष्ठा अंक) वोट देना अच्छा होगा। मुझे आशा है कि आप इस पर अपवाद नहीं लेंगे। –

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

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