2008-10-29 9 views
8

ऐसा लगता है कि स्क्लोनकनेक्शन को तेजी से खोलने और बंद करने में बहुत अधिक ओवरहेड शामिल है। क्या मुझे एक कनेक्शन (एक, प्रति क्लाइंट, प्रति डेटाबेस) जारी रखना चाहिए, या जब भी मुझे एक की आवश्यकता हो, तो एक नया स्क्लोनकनेक्शन ऑब्जेक्ट घोषित करना जारी रखें, और यह सुनिश्चित कर लें कि मैं अपने बाद साफ कर दूं?क्या मुझे अपने डेटा एक्सेस लेयर में एक स्क्लोनकनेक्शन जारी रखना चाहिए?

आपने क्या किया है? क्या अच्छा काम किया और क्या खराब काम किया?

+0

जब में कनेक्शन कर पूल समय बाहर? –

+0

आप इसे कनेक्शनस्ट्रिंग नाम/मानों के माध्यम से नियंत्रित कर सकते हैं: http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.connectionstring.aspx। 'कनेक्शन लाइफटाइम' वाली दूसरी तालिका में नीचे स्क्रॉल करें। –

उत्तर

21

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

आप उपयोग कर रहे हैं एसक्यूएल सर्वर: http://msdn.microsoft.com/en-us/library/8xx3tyca.aspx

OLE DB, ODBC, ओरेकल: http://msdn.microsoft.com/en-us/library/ms254502.aspx

डिनो एस्पोसिटो लेख: http://www.wintellect.com/Articles/ADO%20NET%20Connection.pdf

आप नाम/मान connectionstring के साथ डिफ़ॉल्ट पूलिंग व्यवहार को ओवरराइड कर सकते हैं: http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.connectionstring.aspx। 'कनेक्शन लाइफटाइम' वाली सेटिंग्स की दूसरी तालिका देखें।

+0

दिलचस्प, उसे नहीं पता था। – VVS

4

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

5

डिफ़ॉल्ट सेटिंग्स के अनुसार, बहुत अधिक ओवरहेड नहीं है, कनेक्शन पूल में पूल संग्रहीत किए जाते हैं। इस प्रकार, जब आप कनेक्शन खोलते हैं, तो अक्सर आपको पूल से एक तैयार कनेक्शन मिल जाएगा। एसक्यूएलकनेक्शन बनाने से मुझे कोई परेशानी नहीं मिली है।

1

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

1

यह आम तौर पर करने के लिए एक अच्छी बात नहीं है (आप रिसाव का कारण बन सकते हैं और अंततः कनेक्शन से बाहर हो सकते हैं), लेकिन इसके बजाय कनेक्शन और पूल के लिए कनेक्शन पूल पर भरोसा करते हैं और जितनी जल्दी हो सके कनेक्शन बंद कर देते हैं।

विधेयक वॉन हम ग्राहक डेटाबेस के लिए एक भी लगातार कनेक्शन रखने के लिए किया था वर्षों के लिए कनेक्शन पूलिंग और सहित this one

0

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

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

DbConnection conn = Database.GetConnection(); 
try 
{ 
    //do stuff with the connetion 
    ... 
} 
finally 
{ 
    Database.DisposeConnection(conn); 
} 

हम ऐसा करते हैं जरूरत जब हम डेटाबेस से कनेक्ट प्रारंभ न होने के कारण (हम स्टोर जानकारी एसक्यूएल सर्वर के CONTEXT_INFO है, और उस जानकारी को खाली है जब हम डिस्कनेक्ट करना होगा)

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