2011-01-26 5 views
5

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

डीएएल में डेटाबेस कनेक्शन से निपटने का सबसे अच्छा तरीका क्या है?

ए) प्रत्येक विधि में एक नया कनेक्शन बनाएं और बाद में इसका निपटान करें।
अच्छा: लिखने और काम करने में आसान है।
खराब: कई कनेक्शन खोले जा रहे हैं और बंद हैं। (प्रदर्शन?)

बी) कनेक्शन को एक (वैकल्पिक) तर्क के रूप में पास करें।
अच्छा: मैं एकाधिक आदेशों के लिए एक खुले कनेक्शन का पुन: उपयोग कर सकता हूं।
खराब: मुझे कनेक्शन के स्वामित्व का ट्रैक रखना है (इसे बंद करना है?) और बहुत साफ "उपयोग" कथन का उपयोग नहीं कर सकता है।

सी) कुछ और? (सिंगलटन के रूप में कनेक्शन शायद?)

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

संपादित करें: जैसा कि यह महत्वपूर्ण लगता है, यह एक एएसपी.Net वेबसाइट प्रोजेक्ट है।

+0

टेंगेंशियल हो सकता है, लेकिन एफडब्ल्यूआईडब्ल्यू, मैं निबर्ननेट का उपयोग करता हूं और इसे सब कुछ लटकने देता हूं। यानी nhibernate द्वारा प्रदान की गई सत्र वस्तु के साथ बस काम करें। – Biswanath

उत्तर

5

यदि आप ASP.Net का उपयोग कर रहे हैं, तो विकल्प ए आपका मित्र है।

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

कनेक्शन पूलिंग पर अधिक जानकारी के लिए http://msdn.microsoft.com/en-us/library/8xx3tyca.aspx देखें।

आपको वेब सर्वर में इस तरह से बहुत कुछ करना है, इसलिए आपके पास किसी भी तरह की सहमति नहीं है। सबकुछ थ्रेड-सुरक्षित होना चाहिए (आपको पता नहीं है कि आपके ऐप में कितने समवर्ती कार्यकर्ता थ्रेड निष्पादित हो रहे हैं)।

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

public int Exec( int? @iPatientID) 
{ 
    using (SqlConnection conn = new SqlConnection(this.ConnectString)) 
    using (SqlCommand  cmd = conn.CreateCommand()) 
    using (SqlDataAdapter sda = new SqlDataAdapter(cmd)) 
    { 
    cmd.CommandText = STORED_PROCEDURE_NAME ; 
    cmd.CommandType = CommandType.StoredProcedure ; 

    if (this.TimeoutInSeconds.HasValue) 
    { 
     cmd.CommandTimeout = this.TimeoutInSeconds.Value ; 
    } 

    // 
    // 1. @iPatientID 
    // 
    SqlParameter p1 = new SqlParameter(@"@iPatientID" , SqlDbType.Int) ; 
    if (@iPatientID == null) 
    { 
     p1.Value = System.DBNull.Value ; 
    } 
    else 
    { 
     p1.Value = @iPatientID ; 
    } 
    cmd.Parameters.Add(p1) ; 

    // add return code parameter 
    SqlParameter pReturnCode = new SqlParameter() ; 
    pReturnCode.SqlDbType = System.Data.SqlDbType.Int ; 
    pReturnCode.Direction = System.Data.ParameterDirection.ReturnValue ; 
    cmd.Parameters.Add(pReturnCode) ; 

    DataSet ds = new DataSet() ; 

    conn.Open() ; 
    sda.Fill(ds) ; 
    conn.Close() ; 

    this.ResultSet = (ds.Tables.Count > 0 ? ds.Tables[0] : null) ; 
    this.ReturnCode = (int) pReturnCode.Value ; 

    } 

    return this.ReturnCode ; 

} 
+0

हां, इसकी एक एएसपी.Net वेबसाइट है। लिंक और उत्तर के लिए धन्यवाद। लेकिन मैं समझ नहीं पा रहा हूं कि कनेक्शन कैसे पारित किया जा सकता है? – magnattic

+0

@atticae: यदि कनेक्शन ऑब्जेक्ट एकाधिक धागे द्वारा उपयोग किए जाने पर समाप्त होता है तो यह केवल एक सहमति मुद्दा बन जाएगा। चाहे ऐसा होता है, इस पर निर्भर करेगा कि आपका कोड कैसे संरचित किया गया है, लेकिन यदि आप डेटा-एक्सेस विधि के संदर्भ में कनेक्शन बना रहे हैं और निपटान कर रहे हैं तो यह गलती से होने की संभावना कम है। – StriplingWarrior

+1

एकमात्र ऐसा समय जिसे आप एसक्यूएलकनेक्शन पास करना चाहते हैं, वही होगा यदि एक ही एसक्यूएलट्रैक्शन में भाग लेने के लिए कई डीएएल विधियों की आवश्यकता होती है। यह शायद सबसे अच्छा बचा है। –

1

सबसे अच्छा विकल्प आपके कनेक्शन कनेक्शन पूल को कनेक्शन के जीवनकाल को संभालने दें, और जब आपको उनकी आवश्यकता हो तो पहले से ही खुले रहें! इसका एक उदाहरण http://msdn.microsoft.com/en-us/library/8xx3tyca.aspx

1

ओडीबीसी स्तर या .NET स्तर पर, अधिकांश प्रदाता पूल कनेक्शन वैसे भी हैं।तो विकल्प ए सुरक्षित और संभवतः उतना ही अच्छा प्रदर्शन-वार दोनों है।

देखें: http://msdn.microsoft.com/en-us/library/8xx3tyca.aspx

और: http://msdn.microsoft.com/en-us/library/ms254502.aspx

1

उपयोग वैकल्पिक पैरामीटर के रूप में सभी तीन

लिखें कनेक्शन। यदि कोई भी (शून्य) पास नहीं हुआ है, तो कुछ (सिंगलटन, हो सकता है) साझा स्रोत से कनेक्शन बनाएं ताकि आपके सभी डीएएल वर्ग समान सटीक कनेक्शन स्ट्रिंग के साथ कनेक्शन बना रहे हों (@ निकोलस केरी द्वारा उल्लिखित पूलिंग के लिए)। इसे खोलें और इसे बंद करें अगर आप इसे बनाते हैं।

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

2

हम विकल्प ए का एक संस्करण का उपयोग

हम वास्तव में इकाई की रूपरेखा का उपयोग करें ताकि हम LINQ और इस तरह का लाभ उठाने कर सकते हैं। इकाई फ्रेमवर्क अपने कनेक्शन पूलिंग का प्रबंधन करता है, इसलिए संदर्भ बनाना और हटाना सस्ता है। हम तो निर्भरता इंजेक्शन का लाभ उठाने के कनेक्शन की वास्तविक निर्माण के प्रबंधन के लिए है, तो जैसे:

public class MyDao 
{ 
    IFactory<MyDataContext> _contextFactory; 
    public MyDao(IFactory<MyDataContext> contextFactory) 
    { 
     _contextFactory = contextFactory; 
    } 

    public Foo GetFooById(int fooId) 
    { 
     using (var context = _contextFactory.Get()) 
     { 
      return context.Foos.Single(f => f.FooId == fooId); 
     } 
    } 
} 

इस तरह, यदि हम कभी भी फैसला हम एक अलग कनेक्शन स्ट्रिंग, या और भी अधिक मुश्किल कुछ का उपयोग कर हमारे संदर्भों का निर्माण करना चाहते हैं कि, new MyDataContext() पर प्रत्येक कॉल को ढूंढने के बजाय, हम केवल एक स्थान पर निर्भरता-इंजेक्शन बाइंडिंग को बदल सकते हैं।

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

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