2009-06-19 8 views
7

इससे पहले आज मुझे हमारी परियोजनाओं में से एक में एक बग मिला है - डेटाबेस के साथ एक कनेक्शन है जो कभी बंद नहीं होता है, मेरा मतलब है कि बंद() विधि कभी नहीं कहा जाता है। हालांकि, जब मैं एप्लिकेशन बंद करता हूं, तो कनेक्शन बंद हो जाता है (एसक्यूएल प्रबंधन स्टूडियो में कई बार चेक किया जाता है)। क्यूं कर?एक संलग्न डेटाबेस कनेक्शन का क्या होता है?

उत्तर

4

जब एप्लिकेशन निकलता है तो कनेक्शन बंद हो जाएगा। SqlConnection's Finalize पर पढ़ें। Object.Finalize के लिए एमएसडीएन के दस्तावेज से:

"किसी एप्लिकेशन डोमेन को बंद करने के दौरान, अंतिम रूप से उन वस्तुओं पर अंतिम रूप से बुलाया जाता है जिन्हें अंतिम रूप से मुक्त नहीं किया जाता है, यहां तक ​​कि जो अभी भी सुलभ हैं।"

+0

"यदि एसक्यूएलकनेक्शन गुंजाइश से बाहर हो जाता है, तो यह बंद नहीं होगा। इसलिए, आपको बंद या निपटान को कॉल करके कनेक्शन को स्पष्ट रूप से बंद करना होगा।" - यह एमएसडीएन से भी है, क्या इसका मतलब यह नहीं है कि अगर आप बंद() को कॉल नहीं करते हैं तो कनेक्शन बंद नहीं हो सकता है? – agnieszka

+0

मूल रूप से आप बंद कर सकते हैं, निपटान या उपयोग कर सकते हैं() {}, जैसा कि आपको वैसे भी करना चाहिए। जब ऐप कनेक्शन बंद कर देता है तो भी बंद हो जाएगा, क्योंकि मैंने अपने जवाब में कहा है। – RichardOD

+0

यदि किसी भी समय जीसी कनेक्शन को अंतिम रूप देने का फैसला करता है, तो वे भी बंद हो जाएंगे। – RichardOD

1

एसक्यूएल कनेक्शन बनाने के लिए महंगे हैं और ADO.NET कनेक्शन पूलिंग नामक तकनीक का उपयोग करता है जो उन्हें पुन: उपयोग करने की अनुमति देता है।

MSDN से

उद्धरण:

सशक्त सलाह दी जाती है कि आप हमेशा कनेक्शन जब आप इसे का उपयोग इतना है कि यह कनेक्शन पूल को लौटा दी जाएगी और पुनः उपयोग किया जा समाप्त कर लें बंद कर दें।

यदि अधिकतम पूल आकार पहुंच गया है और कोई उपयोग करने योग्य कनेक्शन उपलब्ध नहीं है, तो अनुरोध कतारबद्ध है। पूलर तब कनेक्शन को पुनः प्राप्त करने का प्रयास करता है जब तक कि टाइम-आउट तक पहुंच गया (डिफ़ॉल्ट 15 सेकंड है)। यदि पूलर कनेक्शन समय से पहले अनुरोध को पूरा नहीं कर सकता है, तो एक अपवाद फेंक दिया जाता है।

+1

वास्तव में कनेक्शन पूल की वजह से, एक SQL कनेक्शन वास्तव में कभी बंद नहीं होता है - जब आप बंद करते हैं तो इसे पुन: उपयोग करने के लिए पूल में वापस लौटा दिया जाता है। एप्लिकेशन बंद होने पर यह बंद हो जाएगा जब आप एप्लिकेशन से बाहर निकलेंगे। इसलिए यदि आप कभी भी कॉल बंद नहीं करते हैं तो कनेक्शन का पुन: उपयोग नहीं किया जाएगा और पूल समाप्त होने के बाद आपको अपवाद मिलेगा। –

+0

@ डारिन- वास्तव में कभी बंद नहीं गलत है। निष्क्रियता की एक निश्चित मात्रा के बाद कनेक्शन बंद हो जाएगा, लेकिन यह सिर्फ नाइटपिकिंग है। – RichardOD

+1

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

1

जब आप नियमित रूप से एप्लिकेशन से बाहर निकलते हैं, तो मुझे उम्मीद है कि फाइनलरों को चलाने की उम्मीद है। यदि कनेक्शन अभी भी खुला है तो वे कनेक्शन बंद कर देंगे। बस इस पर निर्भर न करें: आपके आवेदन के सामान्य संचालन में उन अंतिमकर्ताओं को चलाने में कुछ समय लग सकता है, इसलिए आप बहुत से कनेक्शन खोलेंगे।

जब एप्लिकेशन दुर्घटनाग्रस्त हो जाता है, तो फाइनलर नहीं चलाएगा, जिससे आवेदन के जीवनकाल से पहले कनेक्शन खुल जाएगा।

2

ध्यान में रखना एक और बात यह है कि नेट में, आप अपने कनेक्शन को एक प्रयोग ब्लॉक में लपेट सकते हैं, और यह आपके लिए आपके कनेक्शन बंद कर देगा और निपटान करेगा। तो एक स्पष्ट बंद की कमी() एक बुरी बात अगर आप अपने का उपयोग कर ब्लॉक वहाँ मिल गया है नहीं है ...

// this using block will auto close & dispose your connection... 
using (var conn = new SqlConnection(...)) 
{ 
    conn.Open(); 
    // database code here with no explicit close 

} 

एक कोशिश के कार्यात्मक समकक्ष है कि/अंत में एक conn.close साथ ब्लॉक अंत में कई देवता उपयोग ब्लॉक को अनदेखा करते हैं - सुनिश्चित करें कि आप इस मामले में ऐसा नहीं कर रहे हैं।

यदि आप अपने कनेक्शन को बंद करने के लिए अपने कोड को फिर से लिखते हैं - यह सुनिश्चित करने के लिए कि आप अपने सभी डेटाबेस ऑब्जेक्ट्स (कनेक्शन, कमांड, रीडर) के आसपास ब्लॉक का उपयोग करके यह सुनिश्चित करने के लिए अच्छा अभ्यास कर रहे हैं कि वे बंद होने से निपटने और निपटान कर रहे हैं उपयोग ब्लॉक का। मैं निश्चित रूप से उन लोगों को लिखने का सुझाव दूंगा जो आपके कोड में सिर्फ conn.Close() जहां आवश्यक हो।

+0

हाँप मैं जिस तरह से करता हूं। यदि आप FXCop का उपयोग करते हैं तो आपको कभी भी कोई समस्या नहीं होगी क्योंकि यह आपको निपटान न करने के बारे में चेतावनी देता है। – RichardOD

+0

ब्लॉक का उपयोग नहीं किया गया था, मैं उनके बारे में जानता हूं। – agnieszka

+0

और यह – agnieszka

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

  • कोई संबंधित समस्या नहीं^_^