बस कितना बुरा है डिस्पोज़ () SqlConnections?


14

व्यक्तिगत रूप से, मैं पित्ती में टूट जाता हूं यदि मैं एडीओ ऑब्जेक्ट नहीं डालता हूं जो बयानों का उपयोग करने में आईडीआईसोपायरी को लागू करता है। लेकिन मेरे वर्तमान अनुबंध में, मैंने पाया है कि उनके होमग्रोन एंटरप्राइज फ्रेमवर्क "डेटा एक्सेस प्रोवाइडर" कोड 1) को किसी भी बिंदु पर, किसी भी समय, उपयोग किए जाने वाले आईडीसॉपी और 2) कॉल डिस्पोज़ () को लागू नहीं करता है। Winforms अनुप्रयोगों में प्रदर्शन के मुद्दों के बारे में उपयोगकर्ताओं को बहुत अधिक शिकायत हो रही है जो डेटा एक्सेस के लिए इस ढांचे का भारी उपयोग करते हैं, और हालांकि कोड में अन्य समस्याओं का एक बहुत कुछ है जो प्रदर्शन को मार सकता है, यह सिर्फ मुझ पर चिल्लाता है और अधिक है दूसरों की तुलना में कम फांसी-फल।

तो, कुछ कहने से परे "निपटान एक कारण के लिए है, इसका उपयोग करें," मैं इन लोगों को उन्हें समझाने के लिए क्या कह सकता हूं कि यह वास्तव में है, वास्तव में बुरा है?


5
हेह..मुझे लगता है कि, कुछ बिंदु पर, समझाने की आवश्यकता नहीं होगी :)
डॉ हनीबाल लेक्टर

जवाबों:


6

मैं सबसे अच्छी बात यह है कि आप कर सकते हैं उन्हें Microsoft के पैटर्न और प्रथाओं के बारे में Dispose() यहाँ इंगित करें । उन्हें इस उपकरण का उपयोग न करने का पूरा परिणाम देखने दें जो उनके सामने सही है।


1
बस मेरी इच्छा है कि मुझे एक ऐसा संस्करण मिले जो शीर्ष पर "यह सेवानिवृत्त सामग्री है" चिल्लाया नहीं था।
एजे जॉन्सन

तुम्हें पता है, मेरी आँखें बस उस पर चमकती थीं। लेकिन अब इसे ध्यान से पढ़ते हुए, मुझे आश्चर्य है कि कौन सी प्रौद्योगिकियां हैं जो लोग "अभी भी उपयोग कर रहे हैं" जो उस पृष्ठ से सेवानिवृत्त हो सकते हैं। शायद कैस?
जेसी सी। स्लीकर

इसे अधिक बारीकी से स्कैन करना, इसमें से अधिकांश अभी भी मेरे लिए प्रासंगिक लगता है। निश्चित नहीं है कि यह क्यों सेवानिवृत्त चिह्नित किया गया है।
एजे जॉनसन

10

यदि आप SQL कनेक्शन पर डिस्पोज़ विधि को नहीं कहते हैं, जब आप इसका उपयोग करते हैं, तो वह कनेक्शन वापस कनेक्शन पूल में नहीं मिलता है।

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

Microsoft का सर्वश्रेष्ठ अभ्यास आपको एक कनेक्शन स्टेटमेंट के अंदर अपना कनेक्शन कोड रखने के लिए कहता है, यह सुनिश्चित करता है कि कनेक्शन का निपटान किया गया है और कनेक्शन वापस पूल में वापस आ गया है।


कॉलिंग Closeकनेक्शन पूल में वापस जारी करने के लिए पर्याप्त है। यह प्रश्न स्पष्ट रूप से उपयोग Closeनहीं किया गया है।
user2864740

9

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

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

इन सभी समस्याओं को हल करने का सही तरीका यह है कि जैसे ही आप इसके साथ समाप्त होते हैं, आपके कनेक्शन का निपटान। सबसे अच्छा विचार यह है कि कनेक्शन को यथासंभव लंबे समय तक खुला रखें, और अब नहीं।


1
यह इससे थोड़ा खराब है, यहां तक ​​कि। यदि पूल पर्याप्त रूप से बैकअप ले लेता है, तो कई कनेक्शन प्रयास अंततः विफल हो जाएंगे, जिसमें प्रबंधन उपकरण से कनेक्शन के प्रयास भी शामिल हैं, और आप प्रभावी रूप से डेटाबेस के अपने आप को लॉक कर सकते हैं।
जोएल कोएहॉर्न

3

किसी भी गंभीर अनुप्रयोग में मैं कहूंगा कि यह बहुत बुरा है। न केवल इन वस्तुओं को मारने के प्रदर्शन के आसपास तैरने वाले छोड़ देंगे, यह भी बस अव्यवसायिक है। अच्छी खबर यह है कि Microsoft ऑब्जेक्ट्स पदानुक्रम में अंतिम रूप देता है।

~Object()
{
    this.Dispose(false);    
}

public void Dispose()
{
    this.Dispose(true);
    GC.SuppressFinalize(this);
}

protected virtual void Dispose(bool disposing)
{
    // ...
}

System.Data.SqlClient.SqlConnectionउदाहरण के लिए लें :

System.ComponentModel.Component <- इम्प्लीमेंट्स फ़ाइनलिज़ डिस्पोज़ पैटर्न।
    |
System.Data.Common.DbConnection
    |
System.Data.SqlClient.SqlConnection

अंततः वस्तुओं का निपटान किया जाएगा लेकिन गैर-नियतात्मक प्रकृति प्रदर्शन पर कहर ढाती है।


0

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

मुझे लगता है था ख) की वजह से प्रदर्शन मारा आप का वर्णन कर रहे हैं। हालाँकि, यह एकमात्र कारण नहीं है।

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.