2010-07-15 19 views
7

.NET अनुप्रयोग में डेटाबेस कनेक्शन प्रबंधित करने के लिए सर्वोत्तम अभ्यास के संबंध में - मुझे पता है कि, सामान्य रूप से, कनेक्शन ऑब्जेक्ट को पास करना बुरा होता है।.NET में डेटाबेस कनेक्शन प्रबंधित करने के सर्वोत्तम अभ्यास क्या हैं?

हालांकि, मैं कुछ विशेष अनोखी है: (। बच्चे निजी है)


1. मैं व्यापार वस्तुओं के दो उदाहरणों, विभिन्न वर्गों की, एक माता पिता के बच्चे का रिश्ता में है निम्नलिखित में से कौन सा सबसे अच्छा है?

  • खुला और साझा, दोनों वस्तुओं के द्वारा प्रयोग किया, और जब तक माता-पिता निपटान किया जाता है खुला छोड़ दिया एक निजी स्थिर संबंध रखें।

  • दो निजी स्थैतिक कनेक्शन खोलें, प्रत्येक ऑब्जेक्ट के लिए एक, ऑब्जेक्ट का निपटारा होने तक बंद न हो।

  • स्थिर कनेक्शन न रखें; खोलें और बाद में प्रत्येक विधि के लिए एक नया कनेक्शन बंद करें। हालांकि, मेरी अधिकांश विधियां केवल 1-3 क्वेरी चलाती हैं, इसलिए यह अक्षम लगता है ...?


2. मेरे दूसरे प्रश्न मूलतः एक ही है, लेकिन एक ही रूप के लिए। यहाँ सबसे अच्छा क्या है?

  • खुला और फार्म के जीवन भर के लिए साझा एक निजी स्थिर संबंध रखें।

  • स्थिर कनेक्शन न रखें; खोलने के लिए और बाद में फार्म का है कि ऐसा करना आवश्यक हो में हर विधि के लिए एक कनेक्शन बंद (फिर से, विधि के अनुसार एक मात्र 1-3 प्रश्नों।)

+0

क्या यह एक Winform या ASP.Net एप्लिकेशन है? –

+0

http://stackoverflow.com/questions/tagged/connection-pooling –

+0

[.NET/SQL सर्वर में कनेक्शन पूलिंग] के संभावित डुप्लिकेट देखें (http://stackoverflow.com/questions/8223/connection-pooling-in -नेट-एसक्यूएल-सर्वर) –

उत्तर

10

(एक टिप्पणी था) ...

सिद्धांत आप अपने व्यापार के तर्क से डाटाबेस को ऐक्सेस नहीं किया जाना चाहिए है - यह एक अलग डेटा का उपयोग कक्षा में होना चाहिए। (भविष्य में उदाहरण के लिए कहें कि आपको उन्हें एक्सएमएल में ऑफ़लाइन स्टोर करना होगा, या SQL सर्वर की बजाय ओरेकल का उपयोग करना होगा ... आप अपने व्यवसाय तर्क को फिर से लिखना नहीं चाहते हैं!)

आपकी व्यावसायिक वस्तुओं में नहीं होना चाहिए उनके साथ जुड़े डेटाबेस कनेक्शन। कनेक्शन कुछ डीएएल फैक्ट्री-प्रकार विधि में खोला जाना चाहिए, ऑब्जेक्ट पुनर्प्राप्त/बनाया गया, फिर कनेक्शन बंद हो गया और ऑब्जेक्ट लौटा।

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

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

आशा है कि मदद करता है!

8

मेरे समझ के साथ कि कनेक्शन केवल जब तक जरूरत खुले रहते हैं चाहिए। बार मैं बयान का उपयोग में कनेक्शन देखा है से अधिकांश,

using (DBConnection db = new DBConnection(connectString)) 
{ 
    //do stuff 
} 
+0

यह मेरी समझ भी थी। हालांकि, मैं लगातार खोलने/समापन कनेक्शन के ऊपरी हिस्से के बारे में चिंतित हूं जब मेरे आधे तरीकों में बहुत कम काम होता है, और मुझे आश्चर्य है कि किसी फॉर्म के लिए एक कनेक्शन रखना अधिक कुशल होगा। – Rob

+5

@Rob: कनेक्शन पूल का बिंदु यह है कि असली कनेक्शन खोला और बंद नहीं रहेगा। "ओपन" पूल से मौजूदा, खुले कनेक्शन को आसानी से प्राप्त करेगा। –

6

दोनों सवालों के जवाब में के समान है, आप कुछ कनेक्शन पूलिंग है, ADO.NET की तरह प्रयोग कर रहे हैं, तो आप अपने प्रश्नों रखने के लिए कोड चाहिए जितना संभव हो सके कनेक्शन जितना छोटा हो। अर्थात। open and subsequently close a new connection for every method that requires it.। जब आप कनेक्शन बंद करते हैं तो इसे कनेक्शन पूल में वापस कर दिया जाएगा और बाद की क्वेरी पर पुन: उपयोग किया जाएगा और इस प्रकार आप कनेक्शन के समूह को खोलकर और बंद करके प्रदर्शन दंड नहीं ले पाएंगे। इसका फायदा यह है कि आप उन कनेक्शनों को लीक करने का जोखिम नहीं उठाएंगे जिन्हें आप बंद करना चाहते थे और लंबे समय तक, यदि आप लंबे समय तक कनेक्शन खोलते हैं तो आपके पास कम एक साथ कनेक्शन खुलेंगे। यह कोई फर्क नहीं पड़ता कि एप्लिकेशन एक वेब फॉर्म के बजाय एक विंडोज़ फॉर्म है: जितना संभव हो सके कनेक्शन को खोलें।

7

यह लिंक सहायक हो सकता है: Best Practices for Using ADO.NET

यहाँ एक दिलचस्प अंश है।

सर्वश्रेष्ठ प्रदर्शन के लिए, कनेक्शन डेटाबेस खुला ही जब आवश्यक करने के लिए रहते हैं। साथ ही, कई ऑपरेशन के लिए कनेक्शन खोलने और बंद करने के की संख्या को कम करें।

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