2009-07-01 13 views
12

हम ओरेकल डीबी (माइक्रोसॉफ्ट ऑरैकल क्लाइंट) तक पहुंचने के लिए एंटरप्राइज़ लाइब्रेरी 3.0 का उपयोग करते हैं। क्या होता है जब मैं संग्रहीत प्रक्रिया या फ़ंक्शन के बाद किसी DbCommand इंस्टेंस का निपटान नहीं करता है? क्या .NET स्वचालित रूप से कचरा इकट्ठा करता है? ध्यान दें कि हम यह सुनिश्चित करते हैं कि लेनदेन/कनेक्शन बंद हो जाए और ठीक से निपटान हो।उपयोग के बाद डीबीकॉमैंड का निपटान करना आवश्यक है?

उत्तर

17

यह डुप्लिकेट है, लेकिन मैं मूल खोजने के लिए समय नहीं है।

यदि यह IDISposable लागू करता है, और यदि आपने इसे बनाया है, तो आपको उस पर निपटान करने की आवश्यकता है। यही कारण है कि कक्षा के डेवलपर ने इसे IDISposable लागू किया।

कचरा कलेक्टर कॉल नहीं करता है सभी IDisposable- कार्यान्वयन वस्तुओं पर निपटान।

+0

क्या? नहीं, वह झूठा है। निपटान के लिए मानक पैटर्न उपयोगकर्ताओं को संसाधनों को जल्दी से मुक्त करने की अनुमति देना है, लेकिन अभी भी अंतिमकरण में साफ है यदि विधि अभी तक नहीं बुलाई गई है। – RandomEngy

+0

इस आलेख को देखें: http://msdn.microsoft.com/en-us/library/b1yfkh5e.aspx निपटान() को अंतिमकर्ता में बुलाया जाता है, जो वास्तव में कचरा कलेक्टर को प्राप्त होने पर चलाएगा। – RandomEngy

+4

IDISposable के सभी उपयोगकर्ता अंतिमकरण को लागू नहीं करते हैं। जो लोग अंतिम रूप देने वाले नहीं हैं वे मानक पैटर्न का पालन करेंगे। आप फाइनेंजर के अस्तित्व पर निर्भर नहीं हो सकते हैं, और आप कचरा कलेक्टर द्वारा बुलाए जाने पर निपटने पर निर्भर नहीं हो सकते हैं। –

1

ओरेकल के बारे में 100% निश्चित नहीं है, लेकिन एसक्यूएल कॉमांड का उपयोग करते समय, इसे उपयोग के बाद निपटान किया जाना चाहिए। आप या तो केवल .Dispose (कह सकते हैं), या सिर्फ एक का उपयोग कर ब्लॉक में डाल दिया है, तो जैसे:


using(DbCommand cmd = new DbCommand(foo, bar)) 
{ 
    // use cmd object 
} 
7

परावर्तक यह इंगित नहीं करता है कि OracleCommand विशेष रूप से निपटान (System.ComponentModel.Component के कार्यान्वयन से) को ओवरराइड करता है, तो संभावना है कि यदि आप इसे कॉल नहीं करते हैं तो यह आपके आवेदन को अधिक नुकसान नहीं पहुंचाएगा।

महत्वपूर्ण बात यह है कि OracleCommand विशेष रूप से IDbCommand लागू करता है, जो विशेष रूप से IDisposable लागू करता है। यदि आपने कभी भी OracleCommand को IDbCommand के साथ बदल दिया है, तो आप शायद Dispose() का उपयोग करना चाहेंगे। और SqlCommand स्पष्ट रूप से Dispose() ओवरराइड नहीं करता है, ओडीबीसी और ओलेडीबी निश्चित रूप से करते हैं।

संक्षेप में, क्योंकि यह IDisposable है, इसलिए आपको सुरक्षित पक्ष पर रहने के लिए इसे निपटाना चाहिए।

+0

धन्यवाद। – Vivek

4

प्रलेखन से IDisposable के लिए:

इस इंटरफेस का प्राथमिक उपयोग अप्रबंधित संसाधन जारी करने के लिए है। कचरा कलेक्टर स्वचालित रूप से किसी प्रबंधित ऑब्जेक्ट को आवंटित स्मृति को रिलीज़ करता है जब उस ऑब्जेक्ट का अब उपयोग नहीं किया जाता है। हालांकि, यह अनुमान लगाना संभव नहीं है कि कब कचरा संग्रह होगा। इसके अलावा, कचरा कलेक्टर को अप्रबंधित संसाधनों जैसे खिड़की हैंडल, या खुली फाइलें और धाराओं का कोई ज्ञान नहीं है।

कचरा कलेक्टर के संयोजन के साथ अप्रबंधित संसाधनों को स्पष्ट रूप से रिलीज़ करने के लिए इस इंटरफ़ेस की निपटान विधि का उपयोग करें। किसी ऑब्जेक्ट का उपभोक्ता इस विधि को कॉल कर सकता है जब ऑब्जेक्ट की आवश्यकता नहीं होती है।

इस को देखते हुए, एक वस्तु को लागू करने वाली IDisposable संभावित अप्रबंधित संसाधन के लिए संदर्भ रखता है। ये संसाधन तब तक जारी नहीं किए जाते जब तक कचरा कलेक्टर आ जाता है और ऑब्जेक्ट एकत्र नहीं करता है। हालांकि, चूंकि आप यह नहीं जान सकते कि कचरा कलेक्टर यह कब करेगा, डिस्पोजेबल ऑब्जेक्ट्स (जैसे OracleDbCommand) आप जितना चाहें उतना लंबा लटका सकते हैं।

एक वस्तु को लागू करता है तो IDisposable, आप यह जितनी जल्दी हो सके अप्रबंधित संसाधन है कि यह करने के लिए संदर्भ रखती जारी करने के लिए फोन करना चाहिए। इसे या तो सीधे Dispose पर कॉल करके या इसे उपयोग करने वाले ब्लॉक में घोषित करके पूरा किया जा सकता है।

+1

मैंने यह कहने के लिए पढ़ा कि "इसके अलावा, कचरा कलेक्टर को अप्रबंधित संसाधनों जैसे खिड़की हैंडल, या खुली फाइलें और धाराओं का कोई ज्ञान नहीं है"। इसलिए, जीसी इन संसाधनों को कभी भी जारी नहीं करेगा। –

+1

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

+0

लेकिन आपने कहा "इन संसाधनों को तब तक जारी नहीं किया जाता है जब तक कचरा कलेक्टर आते हैं और ऑब्जेक्ट एकत्र नहीं करते हैं"। इन अप्रबंधित संसाधनों की रिहाई सामान्य रूप से कचरा कलेक्टर पर निर्भर नहीं होती है। –

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