java - जेडीबीसी के साथ कनेक्शन पूलिंग विकल्प: डीबीसीपी बनाम सी 3 पी 0




jdbc connection-pooling (10)

जावा / जेडीबीसी के लिए उपलब्ध सर्वोत्तम कनेक्शन पूलिंग लाइब्रेरी क्या है?

मैं 2 मुख्य उम्मीदवारों (मुक्त / मुक्त स्रोत) पर विचार कर रहा हूं:

मैंने ब्लॉग और अन्य मंचों में उनके बारे में बहुत कुछ पढ़ा है लेकिन निर्णय तक नहीं पहुंच सका।

क्या इन दोनों के लिए कोई प्रासंगिक विकल्प हैं?


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

DriverAdapterCPDS driverAdapterCPDS = new DriverAdapterCPDS();
driverAdapterCPDS.setUrl(dataSourceProperties.getProperty("url"));
driverAdapterCPDS.setUser(dataSourceProperties.getProperty("username"));
driverAdapterCPDS.setPassword(dataSourceProperties.getProperty("password"));
driverAdapterCPDS.setDriver(dataSourceProperties.getProperty("driverClass"));

driverAdapterCPDS.setMaxActive(Integer.valueOf(dataSourceProperties.getProperty("maxActive")));
driverAdapterCPDS.setMaxIdle(Integer.valueOf(dataSourceProperties.getProperty("maxIdle")));
driverAdapterCPDS.setPoolPreparedStatements(Boolean.valueOf(dataSourceProperties.getProperty("poolPreparedStatements")));

SharedPoolDataSource poolDataSource = new SharedPoolDataSource();
poolDataSource.setConnectionPoolDataSource(driverAdapterCPDS);
poolDataSource.setMaxWait(Integer.valueOf(dataSourceProperties.getProperty("maxWait")));
poolDataSource.setDefaultTransactionIsolation(Integer.valueOf(dataSourceProperties.getProperty("defaultTransactionIsolation")));
poolDataSource.setDefaultReadOnly(Boolean.valueOf(dataSourceProperties.getProperty("defaultReadOnly")));
poolDataSource.setTestOnBorrow(Boolean.valueOf(dataSourceProperties.getProperty("testOnBorrow")));
poolDataSource.setValidationQuery("SELECT 0");

एक अच्छा विकल्प जो उपयोग करना आसान है DBPool

"एक जावा-आधारित डेटाबेस कनेक्शन पूलिंग यूटिलिटी, समय-आधारित समाप्ति, कथन कैशिंग, कनेक्शन सत्यापन, और पूल मैनेजर का उपयोग करके आसान कॉन्फ़िगरेशन का समर्थन करता है।"

DBPool


जब हम mutithreading प्रोजेक्ट्स का उपयोग कर रहे हैं तो c3p0 अच्छा है। हमारी परियोजनाओं में हमने डीबीसीपी का उपयोग करके एक साथ कई थ्रेड निष्पादन का उपयोग किया, फिर हमने कनेक्शन थ्रेडआउट प्राप्त किया यदि हमने अधिक थ्रेड निष्पादन का उपयोग किया। तो हम c3p0 विन्यास के साथ गए।


ठीक से कॉन्फ़िगर किए जाने पर डीबीसीपी उत्पादन तैयार है।

उदाहरण के लिए यह 350000 आगंतुकों / दिन की वाणिज्य वेबसाइट पर और 200 कनेक्शन के पूल के साथ उपयोग किया जाता है।

यह बहुत अच्छी तरह से टाइमआउट को संभालता है बशर्ते आप इसे सही तरीके से कॉन्फ़िगर करें।

संस्करण 2 प्रगति पर है और इसकी पृष्ठभूमि है जो इसे विश्वसनीय बनाती है क्योंकि कई उत्पादन समस्याओं का सामना किया गया है।

हम इसे अपने बैच सर्वर समाधान के लिए उपयोग करते हैं और यह सैकड़ों बैच चला रहा है जो डेटाबेस में लाखों लाइनों पर काम करता है।

टॉमकैट जेडीबीसी पूल द्वारा संचालित प्रदर्शन परीक्षणों से पता चलता है कि इसमें सीपी 30 की तुलना में बेहतर प्रदर्शन है।


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

डीबीसीपी ने लगातार हमारे परीक्षण आवेदन में अपवाद उत्पन्न किए और प्रदर्शन के स्तर तक पहुंचने के लिए संघर्ष किया जो सी 3 पी 0 किसी भी अपवाद के बिना संभालने में सक्षम था।

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

तब से हमने 4 प्रमुख हेवी-लोड उपभोक्ता वेब ऐप्स में सी 3 पी 0 का उपयोग किया है और कभी पीछे नहीं देखा है।

अद्यतन: यह पता चला है कि शेल्फ पर बैठे कई सालों बाद, अपाचे कॉमन्स लोक ने http://commons.apache.org/dbcp/ कर लिया है और अब यह एक सक्रिय रूप से विकसित परियोजना है। इस प्रकार मेरी मूल पोस्ट पुरानी हो सकती है।

ऐसा कहा जा रहा है कि, मैंने अभी तक इस नए अपग्रेड किए गए लाइब्रेरी के प्रदर्शन का अनुभव नहीं किया है, और न ही हाल ही में किसी भी ऐप ढांचे में इसे वास्तविक रूप से सुना है।


दुर्भाग्य से वे सभी पुराने हैं। डीबीसीपी को हाल ही में अपडेट किया गया है, अन्य दो बकाया बग के साथ 2-3 साल पुराने हैं।


मैं आपको BoneCP को आज़माने के लिए आमंत्रित करता BoneCP - यह उपलब्ध विकल्पों की तुलना में मुफ़्त, खुला स्रोत और तेज़ है (बेंचमार्क अनुभाग देखें)।

अस्वीकरण: मैं लेखक हूं ताकि आप कह सकें कि मैं पक्षपाती हूं :-)

अद्यतन: मार्च 2010 तक, अभी भी नए पुनर्लेखित अपाचे डीबीसीपी ("टोमकैट जेडीबीसी") पूल से लगभग 35% तेज है। बेंचमार्क खंड में गतिशील बेंचमार्क लिंक देखें।

अद्यतन # 2: (दिसंबर '13) शीर्ष पर 4 वर्षों के बाद, अब एक बहुत तेज़ प्रतियोगी है: https://github.com/brettwooldridge/HikariCP

अद्यतन # 3: (सितंबर '14) कृपया इस बिंदु पर बोनसीपी को बहिष्कृत करने पर विचार करें, हिकारारीसी पर स्विच करने की HikariCP

अद्यतन # 4: (अप्रैल '15) - अब मेरे पास डोमेन jolbox.com का स्वामित्व नहीं है, लेकिन नए मालिक ने पुरानी सामग्री को सावधान रखा है।


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

डीबीसीपी और सी 3 पी 0 के बीच अंतर? बिल्कुल कुछ नहीं! (एक साकाई डेवलपर्स ब्लॉग) http://blogs.nyu.edu/blogs/nrm216/sakaidelic/2007/12/difference_between_dbcp_and_c3.html

ब्लॉग पोस्ट पर टिप्पणियों में जावाटेक आलेख "कनेक्शन पूल शोडाउन" की तरह भी देखें।


इस लेख में एक और विकल्प, प्रॉक्सूल का उल्लेख है।

हो सकता है कि आप यह पता लगाने में सक्षम हो कि क्यों Hibernate bundles c3p0 को इसके डिफ़ॉल्ट कनेक्शन पूल कार्यान्वयन के लिए?


जब कनेक्शन कनेक्शन समाप्त हो गया तो मुझे डीबीसीपी के साथ परेशानी हो रही थी इसलिए मैंने c3p0 को ट्रायल किया। मैं इसे उत्पादन के लिए जारी करने जा रहा था लेकिन फिर प्रदर्शन परीक्षण शुरू किया। मैंने पाया कि c3p0 बहुत प्रदर्शन किया। मैं इसे बिल्कुल अच्छा प्रदर्शन करने के लिए कॉन्फ़िगर नहीं कर सका। मैंने इसे डीबीसीपी के रूप में धीमा पाया।

मैंने फिर टॉमकैट कनेक्शन पूलिंग की कोशिश की।

यह c3p0 जितना तेज़ था और डीबीसीपी के साथ अन्य मुद्दों को ठीक कर रहा था। मैंने 3 पूल की जांच और परीक्षण करने में काफी समय बिताया। यदि आप टोमकैट पर तैनात कर रहे हैं तो मेरी सलाह है कि नए टोमकैट जेडीबीसी पूल का उपयोग करें।





apache-commons-dbcp