2009-06-06 7 views
6

जावा और सी # में, दोनों के पास System.terminate() जैसी कुछ है। यदि मेरे प्रोग्राम में खुले डेटाबेस कनेक्शन, डेटाबेस पाठक, और डेटाबेस कमांड चर हैं, और मैं अपने प्रोग्राम को कैच क्लॉज में समाप्त कर देता हूं, तो डेटाबेस संसाधन अभी भी उपयोग में रहेगा? या वे पूरी तरह से मुक्त हो जाएंगे क्योंकि मेरा पूरा कार्यक्रम अभी निकला है?यदि कोई कंसोल प्रोग्राम समाप्त हो जाता है, तो प्रोग्राम में उपयोग किए गए डेटाबेस कनेक्शन अभी भी खुले रहेंगे?

आम तौर पर, मैं कैसे बनाने के लिए इस तरह के मामलों को संभाल चाहिए यकीन है कि मैं हमेशा मुक्त डेटाबेस कनेक्शन, सामान्य कार्यक्रम समाप्ति या अप्रत्याशित कार्यक्रम समाप्ति के माध्यम से है कि क्या? कोई अच्छा अभ्यास?

उत्तर

0

ऊपर साफ करने के लिए सी # में फेंक, तो आप करेंगे सामान्य रूप से करीबी सम्बन्ध तुरंत उन्हें जैसे का उपयोग कर, के बाद:

using(SqlConnection connection = ...) 
{ 
    ... do something ... 
} // connection disposed/closed here 

हालांकि आम तौर पर आप एक कनेक्शन पूल का उपयोग करेंगे, और यह सब पूल से कनेक्शन लौटाता है। तो आपकी प्रक्रिया में अभी भी डेटाबेस सर्वर से सक्रिय कनेक्शन होंगे।

यदि आप साफ-सफाई बंद करते हैं, तो कनेक्शन पूल को निश्चित रूप से साफ किया जाएगा, और डेटाबेस के वास्तविक कनेक्शन बंद हो जाएंगे (आप डेटाबेस सर्वर पर खुले कनेक्शन को देखकर इसे सत्यापित कर सकते हैं)।

लेकिन ऐसी स्थितियां हैं (उदा। पर्यावरण को कॉल करना। फ़ेलफ़ास्ट) जहां कनेक्शन कनेक्शन बंद किए बिना एप्लिकेशन क्रैश हो सकता है - इस मामले में वे अंततः डेटाबेस सर्वर द्वारा बंद हो जाएंगे और बंद हो जाएंगे।

+0

क्या आप कनेक्शन पूल पर विस्तार कर सकते हैं? और मैं उन्हें कैसे लागू करूं? – Saobi

5

जब तक आप विशेष रूप से कनेक्शन बंद नहीं करते हैं, वे टाइमआउट हिट तक खुले रहेंगे।

मैं इस बाहर कई बार सी # में मुश्किल तरीके से मिल गया है। सर्वोत्तम अभ्यास आपको बंद करने वाले संसाधनों को बंद/बंद करने का निर्देश देते हैं जिन्हें आपको अब आवश्यकता नहीं होगी। फ़ाइल मैं/हे नदियों, डीबी कनेक्शन, आदि आदि

+0

क्या यह सच है भले ही एप्लिकेशन क्रैश हो जाए? (मुखर नहीं, सिर्फ उत्सुक नहीं) –

+1

मैं ऐसा सोचूंगा। मेरा मतलब है, अगर आपके पास कोशिश/पकड़ है और आप एक फ़ाइल को संपादित करने के बीच में थे और मैंने पावर कॉर्ड को यंक किया था। उन बचावों को लिम्बो में खो दिया जाएगा .... –

+0

मुझे लगता है कि यह क्रैश के प्रकार पर निर्भर करता है। कुछ क्रैश रनटाइम को प्रभावित कर सकते हैं (जैसे पावर कॉर्ड, स्टैक ओवरफ्लो इत्यादि) या तो उस स्थिति में, कनेक्शन टाइमआउट तक पहुंचने तक खुला रहेगा। यदि एक साधारण अपवाद फेंक दिया गया है, तो मुझे लगता है कि रनटाइम अभी भी कनेक्शन को बंद करने का प्रयास करेगा (यदि 'अंत में' ब्लॉक में) –

6

एक प्रक्रिया की समाप्ति पर, सभी संबद्ध संसाधनों (incl। स्मृति, हैंडल, कनेक्शन, ...) को मुक्त कर दिया हो जाएगा।

आम तौर पर, सी # में, आप निपटान पैटर्न/using बयान दुर्लभ संसाधनों को नियंत्रित करने के लिए इस्तेमाल करेंगे।

+1

मेरे सर्वोत्तम ज्ञान के लिए, मुझे विश्वास है कि आप सही हैं। जो मुझे उत्सुक लगता है वह यह है कि पीएसयू_कार्डी इसके विपरीत दावा करता है और इसमें अधिक उत्साह है। तो कौन सही है? –

+0

@MasterPeter: यह निश्चित रूप से एक मंच निर्भर चीज है। लेकिन मैंने देखा है कि ज्यादातर प्रमुख प्रणालियों पर, यह मामला है। –

+0

अपवित्र बीमार क्रम को सही किया गया। –

-1

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

try { 
    // open DB connection 
} catch (Exception ex) { 
    // deal with exception 
} finally { 
    // close and dispose connection 
} 
+0

ठीक है। लेकिन क्या होगा यदि मेरे पास पूरे कार्यक्रम में डीबी कनेक्शन स्टेटमेंट फैले हैं, ताकि मैं उन्हें एक कोशिश/पकड़/अंत में एक साथ नहीं रख सकूं। क्या मुझे अपने पूरे कार्यक्रम को एक बड़े प्रयास/पकड़/आखिरकार ब्लॉक में रखना चाहिए, इसलिए जब भी कोई अप्रत्याशित त्रुटि होती है तो मेरा डीबी बंद हो जाएगा? लेकिन सब कुछ एक बड़ी कोशिश/पकड़/अंत में डाल देना सुंदर नहीं है? – Saobi

+0

एरर ... जब प्रक्रिया मौजूद नहीं है तो जीसी कहां है? –

+1

साबी: आपको डीबी कोड को अधिक प्रबंधनीय हिस्सों में विभाजित करना चाहिए और प्रत्येक पर प्रयास/पकड़ ब्लॉक डालना चाहिए। कर्ट: यह प्रक्रिया समाप्त होने से पहले प्रक्रिया से बाहर है, क्योंकि आप असामान्य समाप्ति की गारंटी नहीं दे सकते हैं हमेशा कनेक्शन बंद कर देंगे। –

0

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

1

सी # में, निहित सफाई कचरा कलेक्टर द्वारा किया जाता है, तो एक finalizer एकत्र वस्तु कचरा जा रहा है में कार्यान्वित किया जाता है। डेटाबेस कनेक्शन जैसे अप्रबंधित संसाधनों का कोई भी सफाई, निपटान विधि में किया जा सकता है।

अधिक जानकारी के लिए इस लेख देखें:

कार्यान्वयन अंतिम रूप देने तथा अप्रबंधित संसाधन
http://msdn.microsoft.com/en-us/library/b1yfkh5e(VS.71).aspx

1

जब कोई प्रक्रिया समाप्त हो जाती है, तो सभी फ़ाइल डिस्क्रिप्टर इसे खोलने वाले ऑपरेटिंग सिस्टम द्वारा जारी किए जाने चाहिए। फाइल डिस्क्रिप्टर में फाइलें और सॉकेट शामिल हैं, जो आमतौर पर आपके डेटाबेस कनेक्शन को कवर करेंगे।

जो आपको बताता है वह यह है कि जब आपका क्लाइंट समाप्त हो जाता है तो उसके कनेक्शन बंद हो जाते हैं। यह आपको नहीं बताता कि सर्वर क्या करता है। यह कैसे लिखा जाता है, इस पर निर्भर करता है कि यह पूरी तरह से संभव है कि सर्वर अपने कनेक्शन को खोलने के लिए जारी रहेगा, क्लाइंट के संदेशों की अपेक्षा करता है जो कभी नहीं आएगा, या यहां तक ​​कि डेटा भेजने का प्रयास भी करेगा। ये शायद अंततः समय-समय पर समाप्त हो जाएंगे, लेकिन यह अच्छी तरह से योजनाबद्ध नहीं हो सकता है। (यह एक सभ्य आरडीबीएमएस के लिए होना चाहिए, लेकिन ऐसा नहीं हो सकता है।) तो आपके आरडीबीएमएस के आधार पर, आपको अपने संसाधनों को जारी करने के लिए कहने के लिए नीचे जा रहे सर्वर को बताने के लिए कुछ कदम उठाने पड़ सकते हैं।

1

यदि आप SQL सर्वर के साथ काम कर रहे हैं तो आप sysprocesses में देख सकते हैं या sp_who2 चला सकते हैं। मैं अपने मशीन पर इस परीक्षण किया है और कनेक्शन बंद कर दिया मिलता है अर्थात्:

Console.Write("Opening connection"); 
Console.ReadLine(); 
SqlConnection connection = new SqlConnection(@"Data Source=.\SQLEXPRESS;Initial Catalog=SeniorMail;Integrated Security=SSPI;"); 
connection.Open(); 
SqlCommand command = new SqlCommand("SELECT count(*) from Account", connection); 
Console.Write("Running sql"); 
Console.ReadLine(); 
int? count = command.ExecuteScalar() as int?; 
Console.Write("Now I'll throw an exception"); 
Console.ReadLine(); 
int a = 0, b = 1, c = 0; 

try 
{ 
    c = b/a; 
} 
catch 
{ 
    Environment.Exit(1); 
} 

मैं की sp_who2 दोनों तरफ देख लिया है "अब मैं एक अपवाद फेंक देंगे", और मैं देख सकता हूँ कनेक्शन एप्लिकेशन के बाद गायब हो गया है बाहर निकलता है।