2011-03-14 4 views
8

मैं सी # के साथ पुराने स्कूल ADO.net का उपयोग कर रहा हूं इसलिए इस तरह के बहुत सारे कोड हैं। क्या प्रति प्रश्न एक फ़ंक्शन बनाना और प्रत्येक बार खुले और बंद डीबी बनाना बेहतर है, या उसी कनेक्शन के साथ कई प्रश्नों को चलाने के लिए बेहतर है? उदाहरण केवल उदाहरण के लिए केवल एक प्रश्न है।क्या मुझे प्रत्येक क्वेरी के लिए डीबी खोलना और बंद करना चाहिए?

using (SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["DBConnectMain"].ConnectionString)) 
    { 
     // Add user to database, so they can't vote multiple times 
     string sql = " insert into PollRespondents (PollId, MemberId) values (@PollId, @MemberId)"; 

     SqlCommand sqlCmd = new SqlCommand(sql, connection); 

     sqlCmd.Parameters.Add("@PollId", SqlDbType.Int); 
     sqlCmd.Parameters["@PollId"].Value = PollId; 

     sqlCmd.Parameters.Add("@MemberId", SqlDbType.Int); 
     sqlCmd.Parameters["@MemberId"].Value = Session["MemberId"]; 

     try 
     { 
      connection.Open(); 
      Int32 rowsAffected = (int)sqlCmd.ExecuteNonQuery(); 
     } 
     catch (Exception ex) 
     { 
      //Console.WriteLine(ex.Message); 
     } 
    } 
+0

निरंतर एक से अधिक प्रश्नों (500 की तरह डालता है) के लिए इस है? या आवधिक प्रश्न? पूलिंग का उल्लेख करने के लिए –

उत्तर

7

ज्यादातर मामलों के लिए, प्रति क्वेरी कनेक्शन खोलना और बंद करना तरीका है (जैसे क्रिस लाइवली ने बताया)। हालांकि, कुछ ऐसे मामले हैं जहां आप इस समाधान के साथ प्रदर्शन बाधाओं में भाग लेंगे।

उदाहरण के लिए, पिछले परिणामों पर निर्भर प्रश्नों को निष्पादित करने के लिए अपेक्षाकृत तेज़ी से बहुत बड़ी मात्रा से निपटने के दौरान, मैं एक कनेक्शन में एकाधिक प्रश्नों को निष्पादित करने का सुझाव दे सकता हूं।डेटा के बैच प्रोसेसिंग या रिपोर्टिंग उद्देश्यों के लिए डेटा मालिश करने पर आपको इसका सामना करना पड़ सकता है।

हमेशा की तरह, 'का उपयोग' आवरण का उपयोग करने हालांकि मेम लीक से बचने के लिए सुनिश्चित हो की जो पैटर्न आप का पालन परवाह किए बिना।

+0

'wrapper' का उपयोग करके "उपयोग करें" का क्या मतलब है? –

+0

@ TrackABill.com का उपयोग कर (SqlConnection कनेक्शन = नया SqlConnection (कनेक्शनस्ट्रिंग)) {// कुछ} – MusicAndCode

11

ठीक है, आप उपाय कर सकते हैं; लेकिन जब तक आप using कनेक्शन हैं (इसलिए यदि आप अपवाद प्राप्त करते हैं तो भी उन्हें डिस्पोजेक्ट किया जाता है), और पूलिंग सक्षम है (SQL सर्वर के लिए यह डिफ़ॉल्ट रूप से सक्षम है) इससे कोई फर्क नहीं पड़ता; बंद (या निपटान) पूल के कनेक्शन अंतर्निहित कनेक्शन देता है। दोनों दृष्टिकोण काम करते हैं। क्षमा करें, इससे ज्यादा मदद नहीं मिलती है; पी

अन्य लंबे गैर-डीबी काम करते समय बस एक खुला कनेक्शन न रखें। इसे बंद करें और इसे फिर से खोलें; आप वास्तव में एक ही अंतर्निहित कनेक्शन वापस प्राप्त कर सकते हैं, लेकिन जब आप नहीं थे तो किसी और ने (अन्य थ्रेड) इसका उपयोग कर सकते थे।

+1

+1, क्योंकि यह सुंदर कुंजी है –

3

यदि विधियों को संरचित किया गया है जैसे एकल आदेश को एक विधि में निष्पादित किया जाता है, तो हाँ: प्रत्येक आदेश के लिए कनेक्शन को तत्काल और निपटान करें।

यदि विधियों को संरचित किया गया है कि आपके पास कोड के उसी ब्लॉक में कई आदेश दिए गए हैं, तो बाहरी ब्लॉक को कनेक्शन के लिए उपयोग करने वाले खंड की आवश्यकता होती है।

एडीओ कनेक्शन पूलिंग के बारे में बहुत अच्छा है इसलिए कमांड ऑब्जेक्ट का तत्काल और निपटान बेहद तेज़ होगा और वास्तव में प्रदर्शन को प्रभावित नहीं करेगा।

उदाहरण के तौर पर, हमारे पास कुछ पृष्ठ हैं जो पृष्ठ को लिखने के लिए 50 प्रश्नों को अद्यतन निष्पादित करेंगे। क्योंकि चलाने के लिए क्वेरी निर्धारित करने के लिए शाखा कोड है, इसलिए उनमें से प्रत्येक ने अपने using (connection...) खंडों के साथ लपेटा है।

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

2

ठीक है, हमेशा के रूप में, यह निर्भर करता है। यदि आपके पास एक ही विधि कॉल के भीतर 5 डेटाबेस कॉल है, तो आपको शायद एक कनेक्शन का उपयोग करना चाहिए।

हालांकि, कुछ भी नहीं होने पर कनेक्शन पर होल्डिंग आमतौर पर स्केलेबिलिटी दृष्टिकोण से सलाह नहीं दी जाती है।

2

ADO.NET अब पुराना स्कूल है? वाह, तुमने मुझे पुराना महसूस किया। मेरे लिए विंडोज 3.1 पर बोर्लैंड सी ++ का उपयोग कर रॉग वेव ओडीबीसी पुराना स्कूल है।

उत्तर देने के लिए, आम तौर पर आप समझना चाहते हैं कि आपके डेटा ड्राइवर कैसे काम करते हैं। कनेक्शन पूलिंग के रूप में ऐसी अवधारणाओं को समझें और लेनदेन लागत को जोड़ने/क्वेरी करने और क्वेरी निष्पादित करने के साथ संबद्ध प्रोफाइल को प्रोफ़ाइल करना सीखें। फिर वह ज्ञान लें और इसे अपनी स्थिति लागू करें।