2010-02-09 11 views
7

में डेटाबेस कनेक्शन खोलता हूं तो मान लीजिए कि मेरे पास ASP.NET पृष्ठ है। पेज लोड इवेंट हैंडलर में, मैं डेटाबेस कनेक्शन खोलता हूं और कुछ प्रोसेसिंग करता हूं। लेकिन प्रसंस्करण के बाद, मैं कनेक्शन ऑब्जेक्ट की बंद विधि को कॉल करके कनेक्शन को स्पष्ट रूप से बंद नहीं करता हूं।क्या होता है यदि मैं एक एएसपी.NET वेब पेज

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

+0

जब आप कहते हैं कि "चर" क्या आपका मतलब है आपकी कक्षा के सदस्य फ़ील्ड, या आपका मतलब स्थानीय चर है। –

+0

मेरा मतलब स्थानीय वैरिएबल था, जैसे कुछ वैरिएबल जिसे कक्षा के तरीके के अंदर घोषित किया गया है .. –

+0

डैगर !!!!!!!!! – jaywon

उत्तर

6

MSDN documentation इस बारे में बहुत स्पष्ट है: SqlConnection दायरे से बाहर चला जाता है

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

या तो using ब्लॉक का उपयोग करने के लिए यह स्वचालित रूप से निपटाया, या स्पष्ट रूप से यह .Close()using ब्लॉक को प्राथमिकता दी जाती है।

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

+0

मजेदार बात यह है कि SqlConnection वर्ग पर बंद करें और निपटान के बीच कुछ अंतर हैं। बेशक कॉल करने के बाद फिर से कनेक्शन को दोबारा खोलने में सक्षम होने के स्पष्ट अंतर के अलावा, एसक्यूएलकनेक्शन क्लास को बंद करने के लिए कॉल के दौरान फाइनलाइज़र कतार (जीसी सपप्रेसफिनलाइज (यह) को कॉल करके) से अपंजीकृत नहीं किया जाता है। इससे जीसी पर दबाव बढ़ जाता है। आईएमओ यह वास्तव में एसक्यूएलकनेक्शन वर्ग में एक बग है। – Steven

2

आप using ब्लॉकों का उपयोग करना चाहिए, तो आप सवाल पूछने के लिए नहीं होगा:

using (var conn = new SqlConnection(connectionString)) 
{ 
    using (var cmd = new SqlCommand(commandText, conn)) 
    { 
     using (var reader = cmd.ExecuteReader()) 
     { 
      while (reader.Read()) { /* ... */ } 
     } 
    } 
} 
+0

यदि मैं उपयोग ब्लॉक का उपयोग करता हूं, तो क्या डेटाबेस पर कनेक्शन जीसीसी द्वारा बंद हो जाएगा ?? –

+0

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

+1

असल में, डेटाबेस के साथ कनेक्शन सामान्य रूप से बंद नहीं होगा, लेकिन यह केवल कनेक्शन पूल में वापस आ गया है।लेकिन जब कनेक्शन को सही तरीके से निपटाना (या बंद करना) नहीं है, तो आप पूल को थका रहे हैं और अंत में कनेक्शन पूल टाइमआउट अपवाद प्राप्त करेंगे। – Steven

3

कनेक्शन खुला बने रहे है। यदि आपके पास बहुत सारे पृष्ठदृश्य हैं, और बहुत से खुले कनेक्शन हैं, तो आप 500 त्रुटि प्राप्त कर सकते हैं।

3

(जब नहीं) आपके पृष्ठ ऑब्जेक्ट को अंतिम रूप देने के बाद आपके कनेक्शन बंद नहीं किए जाएंगे, और यह कुछ समय हो सकता है। उपलब्ध कनेक्शनों की संख्या को अधिकतम करना और त्रुटियां प्राप्त करना प्रारंभ करना बहुत आसान होगा।

1

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

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