2008-10-20 10 views
6

का उपयोग करते समय कनेक्शन/डेटाएडर को बंद करने के लिए हमने कनेक्शन पूलिंग त्रुटि संदेशों की खोज की। इसलिए मैं कोड के माध्यम से जा रहा हूं और SqlDataReader ऑब्जेक्ट्स को बंद कर रहा हूं जहां भी उन्हें छोड़ा गया है। मुझे यह जानने की ज़रूरत है कि एक डाटाएडर को बंद करने के लिए कैसे करें (या अगर बंद करने की आवश्यकता है) जो SQLDataSource या ObjectDataSource टैग के SelectStatement विशेषता में निर्दिष्ट है। यदि कनेक्शन नहीं किया जाता है तो कनेक्शन रिसाव हो सकता है?बीटा परीक्षण के दौरान SqlDataSource या ऑब्जेक्टडेटा स्रोत

अग्रिम धन्यवाद!

उत्तर

12

मैं "उपयोग" कीवर्ड का उपयोग करता हूं, खासकर जब डेटाबेस में कनेक्शन खोलने और बंद करने से निपटता है। "उपयोग" निपटान पैटर्न के लिए एक शॉर्टकट है - here एमएसडीएन लेखन के लिए एक लिंक है, और here एक सिंहावलोकन के साथ एक उपयोगी ब्लॉग प्रविष्टि का एक लिंक है।

+1

वही यहाँ। मैं आश्चर्यचकित हूं कि कितने डेवलपर कोड लिखते हैं जो ऑब्जेक्ट्स को स्वचालित रूप से निपटाने के लिए 'उपयोग' कीवर्ड का उपयोग नहीं करते हैं (विशेष रूप से जब डेटाटेडर जैसी चीजों का उपयोग करते हैं)। – Mun

0

कॉलिंग।() को साफ करें और किसी भी आयोजित संसाधनों को रिलीज़ करना चाहिए, लेकिन .Close() method should be getting called as well when an object is done reading from the reader

+4

आपको निपटान() और बंद() दोनों को कॉल करने की आवश्यकता नहीं है। निपटान() बस बंद करें()। आप इसे सत्यापित करने के लिए डीबीडेटा रीडर के स्रोत कोड की जांच कर सकते हैं। – Misha

2

मेरी समझ यह है कि SqlDataSource के साथ, कनेक्शन प्रबंधन आपके लिए किया जाता है, और आपके पास डरने के लिए कुछ भी नहीं है।

ObjectDataSource डेटाबेस से सीधे पहले स्थान पर बात नहीं करता है, इसलिए यह सुरक्षित रहेगा - जब तक अंतर्निहित वस्तु अपना कनेक्शन और पाठक प्रबंधन सही तरीके से करे।

जैसा कि अन्य ने उल्लेख किया है, Close() और using आपके द्वारा ObjectDataSource के साथ उपयोग की जाने वाली कक्षाओं के लिए आपके मित्र हैं।

मेरा झुकाव यह है कि यदि आपने कोडबेस प्रभावी ढंग से साफ़ किया है, तो संभवतः आपने इस मुद्दे को समाप्त कर दिया है।

0

मेरा मानना ​​है कि एसक्लडाटासोर्स अपने स्वयं के कनेक्शन/पाठक मुद्दों को संभालेगा, इसलिए वहां कोई चिंता नहीं है। अपने मैनुअल कनेक्शन के लिए के रूप में, मैं इस पैटर्न अतीत में उपयोगी पाया गया है:

using (SqlConnection connection = new SqlConnection(connectionString)) 
    { 
     try 
     { 
     SqlCommand command = connection.CreateCommand(); 
     command.CommandText = ... 

     connection.Open(); 
     using (SqlDataReader reader = command.ExecuteReader()) 
     { 
      do 
      { 
       while (reader.Read()) 
       { 
        ... handle each row ... 
       } 
      } while (reader.NextResult()); 
     } 
     } 
     catch (Exception ex) 
     { 
      ... error handling ... 
     } 
     finally 
     { 
     if (connection != null && connection.State == ConnectionState.Open) 
     { 
      connection.Close(); 
     } 
     } 
    } 
-1

मैं मानता हूँ, कि ObjectDataSource के लिए बंद अपनी पद्धति का चयन करें द्वारा नियंत्रित किया जाना चाहिए। मेरा ऑब्जेक्टडेटा स्रोत चयन विधि एक SqlDataReader देता है। मेरी चिंता है ... यूआई में लौटने के बाद बंद होने पर SqlDataReader बेकार हो जाएगा। जैसे निम्नलिखित नमूना कोड देखें। मैंने इसे आजमाया नहीं है और विकास के इस चरण में ऐसा नहीं करना चाहता हूं।

SqlDataReader MySelectMethod(){ 
    SqlDataReader dr = null; 
    try{ 
     dr = DBObject.GetDataReader(); 
     return dr; 
    } 
    finally{ 
     dr.Close(); 
    } 
} 

अब तक प्राप्त सभी इनपुट के लिए धन्यवाद!

...........

मेरे समझ के साथ कि SQLDataSource साथ, कनेक्शन प्रबंधन आप के लिए किया जाता है, और आप डरने की कुछ भी नहीं है है।

ObjectDataSource पहली जगह में सीधे डेटाबेस से बात नहीं करता है, तो यह सुरक्षित हो जाएगा - जब तक अंतर्निहित वस्तु को सही ढंग से अपने कनेक्शन और पाठक प्रबंधन प्रदर्शन करती है।

के रूप में दूसरों का उल्लेख किया है, बंद() और का उपयोग कर वर्गों आप ObjectDataSource

के साथ प्रयोग के लिए अपने मित्रों को कर रहे हैं।

+0

यह काम नहीं करेगा। चूंकि यह आखिरकार ब्लॉक में है, रिटर्न होने पर बंद हो जाएगा (कोड कोशिश ब्लॉक से बाहर निकलता है और अंत में निष्पादित करता है)। – tvanfosson

4

पाठ()/निपटान() के प्रदर्शन को बेहतर बनाने के लिए पाठक को निपटाने या बंद करने से पहले संबंधित कमांड ऑब्जेक्ट पर रद्द करें() को कॉल करने पर विचार करें, खासकर जब आप रिकॉर्ड सेट के अंत तक नहीं पहुंच पाएंगे।

उदाहरण के लिए:

  using (var cmd = ...)) 
      { 
       using (var reader = (DbDataReader) cmd.ExecuteReader()) 
       { 
        try 
        { 
         ConsumeData(reader); // may throw 
        } 
        catch(Exception) 
        { 
         cmd.Cancel(); 
         throw; 
        } 
       } 
      } 
2

हम एक उत्पादन वातावरण में यहाँ एक ही समस्या थी।

इस मुद्दे को हल किया गया। पहली समस्या यह थी कि मेरे कोड में कोई भी कथन नहीं था। (यह कुछ साल पहले बनाया गया था, कुछ कम ज्ञान के साथ)।

मैंने फिर SQL सर्वर को स्रोत का उपयोग करने की कोशिश की। लेकिन इससे कोई मदद नहीं मिली।

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

मध्यम लोड पर न्यूनतम पूल आकार में कनेक्शन की संख्या घट गई।

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