2009-06-02 12 views
9

उत्तर के आधार पर मुझे here मिला, मैंने commons-pool को गंभीर रूप से देखना शुरू कर दिया। इसका उपयोग करने का मेरा आखिरी अनुभव 2003 के आसपास था, शायद संस्करण 1.1 या 1.2। इसका मुख्य उपयोगकर्ता, DBCP, कई लोगों द्वारा त्रुटिपूर्ण माना जाता है और इससे बचा जा सकता है।उत्पादन में कॉमन्स-पूल का उपयोग करने के लिए टिप्स

क्या कोई भी अपने स्वयं के पूल लिखने के लिए उत्पादन में कॉमन्स पूल का उपयोग करता है? उपयोग करने के लिए सबसे अच्छा पूल प्रकार क्या है? मैं क्लाइंट इसमें टीसीपी सॉकेट स्टोर करने की योजना बना रहा हूं।

क्या कोई और सामान्य पूल है जो इसे बदल देता है?

+0

डीबीसीपी के बारे में मैंने पहली बार सुना है ... क्या आपके पास कुछ और विशिष्ट है? – skaffman

+0

@ स्काफमैन - ज्यादातर कारणों के बिना कनेक्शन खो गए –

+0

यह दिलचस्प है: http://static.springsource.com/projects/tc-server/6.0/admin/radmjdbc.html ... डीबीसीपी की अपर्याप्तता का उल्लेख करता है। हालांकि, बहुत मदद नहीं है, क्योंकि यह बंद स्रोत है। – skaffman

उत्तर

7

क्या कोई भी अपने आप को पूल लिखने के लिए उत्पादन में कॉमन्स पूल का उपयोग करता है?

हाँ, मैं करता हूं और पूल में टीसीपी कनेक्शन होते हैं, जैसे आप इसका इरादा रखते हैं। यह वसंत के माध्यम से तार है, ताकि आप स्प्रिंग विन्यास को समझते हैं यह सोचते हैं:

<bean class="com.company.ConnectionSupplier"> 
<constructor-arg> 
    <!-- The ConnectionSupplier wraps an object pool --> 
    <bean class="org.apache.commons.pool.impl.GenericObjectPool"> 
    <constructor-arg> 
     <!-- The ObjectPool uses a ConnectionFactory to build new connections --> 
     <bean class="com.company.ConnectionFactory"> 
     <constructor-arg value="server" /> 
     <constructor-arg value="3000" /> 
     </bean> 
    </constructor-arg> 
    <property name="maxActive" value="20" /> 
    <property name="testOnBorrow" value="true" /> 
    </bean> 
</constructor-arg> 
</bean> 

ConnectionFactory BasePoolableObjectFactory प्रदान करता है और चारों ओर एक SocketFactory एक छोटा सा आवरण है।

@ फर्स्ट टिप्पणी: कनेक्शन फैक्टरी कन्स्ट्रक्टर एक सर्वर और एक बंदरगाह लेता है। Overriden makeObject() में, यह सॉकेट बनाता है जो उस सर्वर और पोर्ट से कनेक्ट होता है। यह 'कनेक्शन' ऑब्जेक्ट देता है जो सॉकेट के माध्यम से संचार करने के लिए कुछ सुविधा विधियों के साथ बनाई गई सॉकेट को लपेटता है।

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

+0

आपने कनेक्शन फैक्ट्री को कैसे कार्यान्वित किया है? आप जीवित रहने के लिए कनेक्शन का परीक्षण कैसे करते हैं? –

0

MultiThreadedHttpConnectionManager देखें - यह एक अपाचे कॉमन्स एचटीपी क्लाइंट कनेक्शन पूल मैनेजर है जो शायद बॉक्स के ठीक बाहर आपकी ज़रूरत को पूरा करेगा।

+1

लिखने का मुख्य कारण था जैसा कि मैंने लिखा था, मुझे टीसीपी सॉकेट रखने के लिए पूल की आवश्यकता है, न कि HTTP कनेक्शन। –

0

पहले कॉमन्स-पूल 1.3 का उपयोग न करें, इसमें बहु थ्रेडेड अनुप्रयोगों के साथ कुछ प्रमुख समस्याएं हैं।

दूसरा, जावा 5 concurency पैकेज सभ्य पूल कार्यान्वयन (नमूना here देखें)

+0

क्या सी 3 पी 0 आपको जेडीबीसी सामान के बिना अपने पूल का उपयोग करने देता है? –

+0

मैं सही हो गया, c3p0 हटा दिया, लेकिन मेरी 1.3 कॉमन्स-पूल टिप्पणी अनमोल है, मुझे इसे उत्पादन में खोजने के लिए उम्र लग गई। प्रदर्शन 1.4 तक अपग्रेड करने के बाद substrantially कूद गया ... –

+3

हम 1.5 का उपयोग कर रहे हैं ... जावा 5 वास्तव में एक अच्छा * थ्रेड * पूल है, लेकिन हम एक * ऑब्जेक्ट * पूल –

1

आपको जांचना चाहिए है कि instantation लागत अधिक या पूल से प्राप्त कर रहा है। क्योंकि पूल का उपयोग करने के लिए एकमात्र वैध स्थिति पहली है।

+0

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

+0

एफवाईआई: हम एक अलग क्षेत्र में कॉमन्स-पूल के जेनेरिक ऑब्जेक्टपूल का उपयोग कर रहे हैं लेकिन यह बहुत अच्छी तरह से काम करता है। –

1

क्या आपने Netty या Apache MINA देखा है? वे दोनों आपके टीसीपी कनेक्शन का ट्रैक रखेंगे और जो भी संचार प्रोटोकॉल लागू करेंगे उन्हें टीसीपी सॉकेट भी आसानी से उपयोग करेंगे।

+0

जहां तक ​​मुझे पता है कि वे सर्वर को लागू करने के लिए उपयोग नहीं किए जाते हैं, न कि ग्राहक। क्या मैं उन्हें क्लाइंट टीसीपी पूल लागू करने के लिए उपयोग कर सकता हूं? –

+1

हां। नेटटी और मिनी दोनों ही आपको क्लाइंट लिखने की अनुमति देते हैं। – trustin

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