2009-08-28 21 views
13

के लिए टिप्स क्या हैं मैंने फैसला किया कि एक ओआरएम का उपयोग न करें और मेरे प्रोजेक्ट के लिए सीधे ADO.NET का उपयोग न करें। मुझे पता है कि मुझे पता है कि यह कार्यक्रम में अधिक समय लगेगा, लेकिन मैं सिर्फ पेजों को चरम समय पर भी तेज गति से लोड करना चाहता हूं।सी # - कुछ उच्च प्रदर्शन सर्वोत्तम अभ्यास/ADO.NET

+0

क्या डेटाबेस (मैं SQL सर्वर मानता हूं)? – MusiGenesis

+0

मैं समयपूर्व अनुकूलन से बचूंगा। * सादे पुराने * ADO.NET का उपयोग करने के लिए – Alex

+6

+1 :) –

उत्तर

9

एक त्रुटि मैं बार-बार देखते हैं और फिर से:

instantiating और सब कुछ (DbConnection, DbCommand, DbParameters) एक तरीका है जिसके एक तंग पाश में बार-बार कहा जाता है के अंदर की स्थापना।

अधिकांश समय आप क्लास सदस्यों के रूप में उन स्थानीय चरों को दोबारा शुरू कर सकते हैं और विधि के अंदर केवल डीबी पैरामीटर को अद्यतन रखते हैं। इस लूप के बाहर दोहराव सामान ले जाने के बारे बिंदु प्रदर्शित करने का एकमात्र उद्देश्य के लिए एक त्वरित इकट्ठे नमूना है:


टिप्पणी

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


class PersonDal { 
    public int Insert(Person person) { 
     DbProviderFactory factory = SqlClientFactory.Instance; 

     using (DbConnection connection = factory.CreateConnection()) { 
      connection.Open(); 

      connection.ConnectionString = "Whatever"; 

      using (DbCommand command = connection.CreateCommand()) { 
       command.CommandText = "Whatever"; 
       command.CommandType = CommandType.StoredProcedure; 

       DbParameter id = command.CreateParameter(); 
       id.ParameterName = "@Id"; 
       id.DbType = DbType.Int32; 
       id.Value = person.Id; 

       DbParameter name = command.CreateParameter(); 
       name.ParameterName = "@Name"; 
       name.DbType = DbType.String; 
       name.Size = 50; 
       name.Value = person.Name; 

       command.Parameters.AddRange(new DbParameter[] { id, name }); 

       return (int)command.ExecuteScalar(); 
      } 
     } 
    } 
} 

अब हम यह लूप से बाहर छोड़ने वस्तुओं निर्माण करने के लिए सेटअप के लिए कदम:


     public static void Show() { 
      List people = new List(); 

      //Everything is done inside the loop 
      PersonDal personDal = new PersonDal(); 
      foreach (Person person in people) { 
       personDal.Insert(person); 
      } 

      //Things are setup once outside the loop. 
      using (DbConnection connection = SqlClientFactory.Instance.CreateConnection()) { 
       // setup the connection 
       BetterPersonDal betterPersonDal = new BetterPersonDal(connection); 
       connection.Open(); 
       foreach (Person person in people) { 
        betterPersonDal.Insert(person); 
       } 
      } 
     } 
    } 

    class Person { 
     public int Id { get; set; } 
     public string Name { get; set; } 
    } 

यह पहली कार्यान्वयन पर, हर चीज हर बार विधि कहा जाता है की स्थापना की है:


class BetterPersonDal { 
    private DbProviderFactory factory; 
    private DbConnection connection; 
    private DbCommand command; 
    private DbParameter id; 
    private DbParameter name; 

    public BetterPersonDal(DbConnection connection) { 
     this.command = connection.CreateCommand(); 
     this.command.CommandText = "Whatever"; 
     this.command.CommandType = CommandType.StoredProcedure; 

     this.id = command.CreateParameter(); 
     this.id.ParameterName = "@Id"; 
     this.id.DbType = DbType.Int32; 

     this.name = command.CreateParameter(); 
     this.name.ParameterName = "@Name"; 
     this.name.DbType = DbType.String; 
     this.name.Size = 50; 

     this.command.Parameters.AddRange(new DbParameter[] { id, name }); 
    } 

    public int Insert(Person person) { 
     this.id.Value = person.Id; 
     this.name.Value = person.Name; 

     return (int)command.ExecuteScalar(); 
    } 
} 

+0

शामिल उदाहरण –

4

Improving .NET Application Performance and Scalability पुस्तक (एमएसडीएन में मुफ्त में ऑनलाइन उपलब्ध) पर एक नज़र डालें। ADO.NET प्रदर्शन में सुधार के बारे में whole chapter है।

+0

उत्कृष्ट लिंक। एकमात्र चीज जो मैं असहमत हूं, प्रदर्शन के लिए संग्रहित प्रक्रियाओं का उपयोग करने पर उनका जोर है। जैसा कि मैं इसे समझता हूं, एसक्यूएल सर्वर के आधुनिक संस्करणों को एसक्यूएल प्रश्नों के लिए निष्पादन योजनाओं को कैश करता है, इसलिए एक विज्ञापन प्रक्रिया के बाद एक संग्रहित प्रक्रिया के रूप में तेज़ी से चलने के बाद एक विज्ञापन कार्य चलाया जाता है। हालांकि, लिंक किया गया आलेख वास्तव में माइक्रोसॉफ्ट से है, इसलिए मैं दावा नहीं कर रहा हूं कि मैं उनसे बेहतर जानता हूं। मैंने हाल ही में किए गए सभी बेंचमार्किंग में, संग्रहित प्रक्रियाओं और विज्ञापन संबंधी प्रश्नों का प्रदर्शन लगभग समान है। – MusiGenesis

+1

वास्तव में एक बहुत अच्छी किताब है। मेरे पास इसका एक मुद्रित संस्करण है। दुर्भाग्यवश इसे 2004 से अपडेट नहीं किया गया है और बहुत सी चीजें बदल गई हैं। उदाहरण के लिए DataRow की बैकिंग स्टोर पूरी तरह से .Net 2.0 में फिर से लिखी गई थी, जो संस्करण 1.x और 2.0 के बीच डेटासेट का उपयोग करने की प्रदर्शन प्रोफ़ाइल को नाटकीय रूप से बदल दिया गया था। –

2

संबंध प्रबंधन के बारे में बहुत होशियार रहें। एक डीबी कनेक्शन खोलना बहुत महंगा हो सकता है इसलिए डेटाबेस एक्सेस लेयर लिखते समय इसे ध्यान में रखें और इसे ध्यान में रखें।

+4

कनेक्शन पूलिंग सक्षम होने पर यह वास्तव में कोई समस्या नहीं होनी चाहिए। एक कनेक्शन ऑब्जेक्ट को इंस्टेंट करना और इसकी 'ओपन' विधि को कॉल करना आमतौर पर डेटाबेस से एक बिल्कुल नया कनेक्शन स्थापित करने के बजाय, पूल से उपलब्ध कनेक्शन ले जाएगा। – LukeH

+2

ल्यूक के साथ सहमत हुए। कनेक्शन 10 से अधिक वर्षों के लिए (अधिक) के बारे में चिंता करने लायक नहीं हैं। – MusiGenesis

+0

मुझे वीबी.Net में लिखा गया एक विरासत कोड मिला है जिसमें प्रत्येक व्यक्ति मिश्रित है जैसे कि यह वीबी 6 में लिखा गया था: कोई परत नहीं, कोई कक्षा नहीं, फॉर्म के अंदर सभी कोड और बेस मॉड्यूल ... –

1

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

कुछ लिंक:

ASP.NET वेब साइट निष्पादन सुधार http://www.codeproject.com/KB/aspnet/aspnetPerformance.aspx

10 ASP.NET प्रदर्शन और अनुमापकता राज http://www.codeproject.com/KB/aspnet/10ASPNetPerformance.aspx

ASP.NET अजाक्स और नेट पर

उमर अल Zabir ब्लॉग 3.5 http://msmvps.com/blogs/omar/archive/tags/performance/default.aspx

1

लेख मार्टिन लिंक उत्कृष्ट है। मैं बस जोड़ता हूं कि आप निश्चित रूप से डेटासेट के बजाय डेटा रीडर का उपयोग करना चाहते हैं (मुझे डेटासेट पसंद है, लेकिन प्रदर्शन कारणों से नहीं)।

+0

जब तक आपको वापस जाना नहीं है डेटा रिकॉर्ड का उपयोग करने वाले मामले में पिछले रिकॉर्ड एक अच्छा विचार हो सकता है। –

+0

@ अल्फ्रेड: उन्होंने कहा कि वह "चाहते हैं [पेज] पृष्ठों को उच्च गति पर लोड करना चाहते हैं", इसलिए मुझे लगता है कि वह एएसपी.Net के बारे में बात कर रहा है। इस मामले में उपयोगकर्ता को डेटासेट में पिछले रिकॉर्ड पर वापस जाने का अर्थ डेटासेट को कैशिंग करना होगा, जो शायद एक अच्छा विचार नहीं होगा। – MusiGenesis

+0

@MusiGenesis: मैं आपसे असहमत नहीं हूं। आपने कहा कि आप डेटासेट्स से प्यार करते हैं और मैं एक उदाहरण दे रहा हूं जब वे उपयुक्त हों। यहां तक ​​कि * सुपर डुपर * हाई स्पीड वेबपृष्ठ पर, किसी को भी तर्क हो सकता है कि जो भी व्यावसायिक कारणों से पिछले रिकॉर्ड तक पहुंच की आवश्यकता हो। डेटाबेस पर वापस जाने के बजाय, डेटासेट का उपयोग करें। कैश पर कोई डेटासेट नहीं - कुछ भी नहीं। अनुरोध के जीवनकाल के दौरान बस एक डेटासेट का उपयोग किया जा रहा है। –

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