2011-02-09 15 views
8

मुझे जरूरी नहीं कि सिंगलटन पैटर्न का उपयोग करके कार्यान्वित किया जाए, बल्कि, केवल पूल के एक उदाहरण का उपयोग करना और उपयोग करना। मुझे सिर्फ एक पूल (या एक पूल प्रकार प्रति) रखने का विचार पसंद नहीं है। हालांकि, मैं वास्तव में किसी भी ठोस परिस्थितियों के साथ नहीं आ सकता हूं जहां म्यूटेबल प्रकार के लिए एकाधिक पूल का लाभ होता है, कम से कम कोई भी पूल जहां भी एक पूल कार्य कर सकता है।क्या ऑब्जेक्ट पूल के लिए सिंगलटन के रूप में इलाज करने का कोई कारण नहीं है?

सिंगलटन पूल पर एकाधिक पूल रखने के क्या फायदे हैं?

+2

सब कहाँ है? –

+0

मुझे आश्चर्य है कि मैंने ऑब्जेक्ट पूल (सरल, पुन: प्रयोज्य वस्तुओं की स्मृति/आजीवन प्रबंधन) का उपयोग कैसे किया है, इस बात से प्रभावित हुआ है कि मैं इन उत्तरों को कैसे समझता हूं। ऐप पूल, थ्रेड पूल, ऑब्जेक्ट पूल की मेरी समझ बनाम कनेक्शन पूल मुझे बहुत से सेब बनाम संतरे लगता है। –

उत्तर

2

क्या फायदे एक सिंगलटन पूल से अधिक कई पूल होने के लिए देखते हैं?

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

हालांकि, कुछ ऐसे स्थान हैं जहां हमारे पास वास्तव में कई पूल हैं: आईआईएस एप्लिकेशन पूल और डेटाबेस कनेक्शन पूल।

अनुप्रयोग पूल

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

  • एकाधिक वस्तु पूल, अलगाव के कुछ डिग्री के लिए अनुमति तो एक पूल में एक त्रुटि एक प्रभाव नहीं होना चाहिए अन्य पूल में वस्तुओं पर।

  • प्रत्येक पूल एक अलग उपयोगकर्ता के तहत चलाया जा सकता है, जो आपको अपने एप्लिकेशन पूल के आधार पर सुरक्षा के विभिन्न स्तर प्रदान करता है।

  • प्रत्येक पूल में त्रुटियों के लिए एक अलग हैंडलर हो सकता है।

  • प्रत्येक पूल .NET ढांचे के एक अलग संस्करण के साथ चला सकता है।

  • प्रत्येक पूल का अपना HTTP टाइमआउट हो सकता है।

कनेक्शन पूल

एसक्यूएल सर्वर में, हर क्वेरी पर एक नया डेटाबेस कनेक्शन, तथापि एसक्यूएल सर्वर creates a new pool per connection string बनाने की भूमि के ऊपर से बचने के लिए पूलिंग एक डेटाबेस उपयोग कनेक्शन से कई कॉल। मुझे लगता है कि इस डिजाइन के पीछे तर्क निम्नानुसार है:

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

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

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

एक पूल

आप वास्तव में कई पूल या क्या तुम सच में अपने डिजाइन से जरूरत की ओर देखे बिना एक भी पूल के लिए है कि क्या चयन नहीं कर सकते कैसे डिजाइन करने के लिए।

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

+0

ऐप और कनेक्शन पूल ऑब्जेक्ट पूल का उपयोग करने के लिए सेब बनाम संतरे की तरह महसूस करते हैं। मैं निश्चित रूप से उनके लिए सिंगलटन नहीं होने के लाभ देख सकता हूं, लेकिन मेरे लिए अपने पूल उपयोग के खिलाफ तुलना करना मुश्किल है। यह शायद मेरे हिस्से पर एक विफलता है, लेकिन मैं मदद नहीं कर सकता लेकिन स्मृति/आजीवन प्रबंधन परिप्रेक्ष्य से पूल तक पहुंच सकता हूं - मैंने केवल वस्तुओं को बनाने और नष्ट करने के लिए उन्हें काट दिया है। –

3

हां, कई ऑब्जेक्ट पूल रखने के लिए निश्चित रूप से संभावित कारण हैं - विशेष रूप से, आप एक पूल को अन्य लोगों को रखने के दौरान कचरा संग्रह (या मैन्युअल रूप से इसे मुक्त करने) के योग्य होने देना चाहते हैं।

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

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

+0

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

+0

@ क्रिस: एक गेम इंजन आम तौर पर केवल एक गेम चला रहा है। कल्पना करें कि एक गेम * सर्वर * लिखना, हालांकि, कई गेम समन्वयित कर रहा था। उनमें से प्रत्येक गेम अपने स्वयं के पूल चाहता है ... –

+0

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

0

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

public class MyClass 
{ 
    public static MyClass GetInstance() 
    { 
      return singleton_ ?? (singleton = new MyClass()); 
    } 
} 
+2

यह प्रश्न का उत्तर नहीं देता है। यह कैसे है, यह whys के बारे में नहीं है। –

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

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