2010-02-22 25 views
11

तो मैं अपने डेटाबेस कनेक्शन पर सर्वोत्तम प्रथाओं को समझने की कोशिश कर रहा हूं। मेरे पास एक बड़ा .NET GUI है जो MySQL डीबी के लिए फ्रंट एंड के रूप में कार्य करता है। वर्तमान में मैं एप्लिकेशन लोड पर एक कनेक्शन खोलता हूं और मुझे जो भी इंटरैक्शन चाहिए, उसके लिए इसका उपयोग करता हूं। हालांकि, संपूर्ण जीयूआई एकल थ्रेडेड है।मल्टीथ्रेडिंग और डेटाबेस कनेक्शन

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

क्या आवेदन जितने भी आदान प्रदान के लिए एक नया कनेक्शन खोलने बनाम का एक खुला संबंध रखने के फायदे/नुकसान कर रहे हैं?

इसके लिए कुछ सामान्य डिजाइन पैटर्न क्या हैं?

धन्यवाद

जोनाथन

उत्तर

6

उपयोग एक धागा सुरक्षित कनेक्शन पूल और कनेक्शन रखने के धागे की विशिष्ट (धागे भर में कनेक्शन का हिस्सा नहीं है)।

मेरा मानना ​​है कि। MySQL नेट कनेक्शन ढांचे में बनाया गया एक के साथ आता है आप सभी कनेक्शनों के लिए एक ही कनेक्शन स्ट्रिंग का उपयोग करते हैं, बस "पूलिंग = सच" अपने कनेक्शन स्ट्रिंग में जोड़ें। (Source - कोई हाइपरलिंक खंड नहीं है, इसलिए तालिका में "पूलिंग" की तलाश करें)

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

1

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

Here संसाधन साझाकरण पैटर्न पर एक लेख है। उदाहरण अडा में हैं लेकिन मुझे यकीन है कि आप इसे वैसे भी पढ़ सकते हैं।

1

कोई डेटा स्रोत से कनेक्ट समय लग सकता है। कनेक्शन खोलने की लागत को कम करने के लिए, एडीओ.NET कनेक्शन पूलिंग नामक ऑप्टिमाइज़ेशन तकनीक का उपयोग करता है, जो बार-बार खुलने और कनेक्शन बंद करने की लागत को कम करता है। .NET Framework डेटा प्रदाताओं के लिए कनेक्शन पूलिंग को अलग-अलग संभाला जाता है।

MSDN से

यहाँ देख Connection Pooling (ADO.NET)

3

2 तरीके हैं:

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

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

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

0

हमने तय करने से पहले कुछ परीक्षण किया है कि किस तरह से जाना है। मेरा मतलब है कनेक्शन कनेक्शन के बीच खोलें या कनेक्ट करें और डिस्कनेक्टइचटाइम।

स्पष्ट रूप से एसक्यूएल सर्वर (कभी भी MySQL के साथ प्रयास नहीं किया गया) के साथ .NET से कोई दृष्टिकोण में कोई प्रदर्शन प्रदर्शन दंड नहीं था (आश्चर्य की बात नहीं है, क्योंकि निचली परतें कनेक्ट एंडडिस्कनेक्टएचटाइम परिदृश्य में तुरंत डिस्कनेक्ट नहीं होती हैं)। लेकिन एक सूक्ष्म अंतर था जिसने हमें कनेक्शन के लिए निर्णय लिया। ओपन। कारण लेनदेन समर्थन था। यदि आप लेनदेन का उपयोग करना चाहते हैं तो कनेक्ट/डिस्कनेक्ट काम नहीं करेगा, मुझे लगता है कि यह स्पष्ट रूप से क्यों है।

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

+0

जब आप कहते हैं कि कनेक्ट एंडडिस्कनेक्ट परिदृश्य के लिए लेनदेन समर्थन संभव नहीं है, तो क्या आप एक "वैश्विक" लेनदेन के बारे में बात कर रहे हैं जो एप्लिकेशन लॉन्च होने के बाद से सबकुछ वापस करने का समर्थन करेगा? यदि नहीं, तो Connect और डिस्कनेक्ट के साथ भी आप लेनदेन का समर्थन कर सकते हैं। आपको "उच्च स्तरीय" लेनदेन की पहचान करने के लिए अपना कोड व्यवस्थित करना होगा और फिर सी # (http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.aspx) में "ट्रांज़ेक्शनस्कोप" उदाहरण के लिए उपयोग करना होगा। – FrenchData

+0

@ फ्रैंचडाटा मैं व्यापार तर्क परत से आने वाले मध्यम स्तर के लेनदेन के बारे में बात कर रहा हूं। हमने ट्रांज़ेक्शनस्कोप दृष्टिकोण की कोशिश की है लेकिन यह पर्याप्त नहीं था, हम जल्दी से परेशानी में भाग गए, क्योंकि मध्य-स्तर कोड का उपयोग विभिन्न अप्रत्याशित तरीकों से किया गया था। समाधान किसी भी तरह से दोनों दृष्टिकोणों के बीच एक संकर था, हमारे कनेक्शन प्रबंधक वर्ग दोनों दृष्टिकोणों का समर्थन करते थे। बेशक कि ऐप से लेनदेन की कोई आवश्यकता नहीं थी, यही कारण है कि हाइब्रिड समाधान बेहतर था। – AureliusMarcus

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