JDBC के साथ कनेक्शन पूलिंग विकल्प: DBCP बनाम C3P0


312

जावा / JDBC के लिए सबसे अच्छा कनेक्शन पूलिंग पुस्तकालय क्या उपलब्ध है?

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

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

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

जवाबों:


181

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

DBCP ने लगातार हमारे परीक्षण एप्लिकेशन में अपवाद उत्पन्न किए और प्रदर्शन के स्तर तक पहुंचने के लिए संघर्ष किया जो C3P0 बिना किसी अपवाद के निपटने में सक्षम से अधिक था।

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

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

अद्यतन: यह पता चला है कि एक शेल्फ पर बैठने के कई वर्षों के बाद, अपाचे कॉमन्स लोक ने डीबीसीपी को निष्क्रियता से बाहर निकाल लिया है और यह अब एक बार फिर सक्रिय रूप से विकसित परियोजना है। इस प्रकार मेरा मूल पद पुराना हो सकता है।

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


2
धन्यवाद! सुझाए गए Proxool विकल्प के बारे में कैसे? हाइबरनेट का वर्तमान संस्करण c3p0 और Proxool दोनों के साथ आता है।
डेमा

हमने Proxool की कोशिश नहीं की है, लेकिन मैं इसे अभी देखना सुनिश्चित करूंगा :)
j pimmel

5
c3p0 में कुछ कमियां हैं। यह कभी-कभी कनेक्शन चोटियों को संभालने में विफल रहता है।
जेनिंग

3
जब आप पहली बार इस उत्तर को पोस्ट करते हैं, तो 4 साल बाद चीजें बहुत बदल गई हैं, क्या आप वर्तमान परिदृश्य को साझा करते हुए अपडेट जोड़ सकते हैं, यदि संभव हो तो?
रजत गुप्ता

13
मैं HikariCP की अत्यधिक अनुशंसा करता हूं , लेकिन फिर मैंने इसे लिखने में मदद की।
ब्रेटवेव

177

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

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

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

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

# अद्यतन 3: (सितम्बर '14) कृपया पर विचार BoneCP जा करने के लिए पदावनत इस बिंदु पर, का उपयोग करने जा सलाह देते हैं HikariCP

अपडेट # 4: (अप्रैल '15) - अब मैं डोमेन jolbox.com का मालिक नहीं हूं


1
वास्तव में टॉमकैट डेटास्रोत के रूप में BoneCP का उपयोग करके एक समस्या निवारण का प्यार मिलेगा। इसके साथ मुझे जो मुख्य समस्या थी, वह यह थी कि टॉमकैट के लिबास में बीओएनसीपी क्लासेस और साथ ही लॉग 4 जे और गूगल क्लासेस की जरूरत थी। ऐसा करने से कनेक्शन पूल काम कर गया - (यह डब्ल्यूएआर में काम नहीं किया गया था) - हालांकि इसने
टॉमकैट की लॉग 4 जे

1
यह एक log4j मुद्दे की तुलना में कुछ और की तरह लगता है। मुझे forum.jolbox.com पर एक लाइन ड्रॉप करें और मैं आपको ASAP को ट्रैक करने में मदद करूंगा।
16

3
1up, BoneCP शानदार है। C3P0 से स्विच किया गया। यह भी मुझे log4jdbc- रीमिक्स पर अपनी निर्भरता को हटाने की अनुमति देता है, क्योंकि यह कथन को बॉक्स से लॉग आउट करने की अनुमति देता है!
subes

68
कुछ के बारे में अद्यतन करने के लिए +1 जो आपने तेजी से नहीं लिखा है!
कोराथन

1
@AndrewScottEvans संभवत: v0.7.1 पर वापस आने के लिए सबसे अच्छा है
15:27

16

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

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

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


14

DBCP के साथ स्वत: पुन: कनेक्ट करने के मुद्दे के लिए, निम्न 2 कॉन्फ़िगरेशन मापदंडों का उपयोग करने की कोई कोशिश की गई है?

validationQuery="Some Query"

testOnBorrow=true

प्रलेखन के रूप में , testOnBorrowडिफ़ॉल्ट मान है true, इसलिए यदि validationQueryपरिभाषित किया गया है तो DBCP आवेदन करने से पहले हर कनेक्शन का परीक्षण करेगा।
dma_k 10


12

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

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");

8

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

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

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


4
एकल पिरोया वातावरण में तेजी से, हो सकता है, छोटी गाड़ी और संयुक्त राष्ट्र के स्थिर और बस कहीं और टूट गया।

7

एक अन्य विकल्प, प्रोक्सूल का उल्लेख इस लेख में किया गया है ।

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


7

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


यह सच है - C3PO की अंतिम रिलीज (0.9 पूर्व-रिलीज़) मई 2007 से है। Proxool (0.9 पूर्व-रिलीज़) की नवीनतम रिलीज़ अगस्त 2008 से है। DBCP की अंतिम रिलीज़ अप्रैल 2007 से भी है, लेकिन कम से कम इसकी स्थिर 1.2 रिलीज। वहाँ वास्तव में कुछ भी बनाए रखा है?
Guss

4
निष्पक्ष होने के लिए ये बड़े प्रोजेक्ट नहीं हैं, इसलिए आपको C3P0 / DBCP में कम और कम अपडेट की उम्मीद करनी चाहिए और समय बीत जाता है।
१६:

7

यदि ठीक से कॉन्फ़िगर किया गया है तो Dbcp उत्पादन तैयार है।

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

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

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

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

प्रदर्शन परीक्षण टेम्कोट jdbc पूल द्वारा चलाया जाता है यह cp30 की तुलना में बेहतर प्रदर्शन करता है।


UBIK लोड पैक - हम DBCP 1.4 का उपयोग कर रहे हैं और 10000 रिकॉर्ड के साथ हमारे एकल बैच के निरंतर हैंग में चल रहे हैं। हम स्प्रिंग बैच + JSR 352 का उपयोग कर रहे हैं और HikariCP पर स्विच करने की सोच रहे हैं। जब आप कहते हैं, 100 बैचों का संचालन सुचारू रूप से चल रहा है, तो क्या इसका मतलब यह है कि आप DBCP 2.x या किसी अन्य संस्करण के साथ चल रहे हैं? इसके अलावा, क्या आप कॉन्फ़िगरेशन साझा करना चाहेंगे? हमारा विन्यास अधिकतम है = 150, न्यूनतम = 15, अधिकतम 1 = 75, प्रारंभिक = 15, लेकिन देखा नहीं कि हैंग चले जाते हैं। हम किसी सत्यापन या टेस्टऑनब्रिज / टेस्टऑन रीट का उपयोग नहीं कर रहे हैं। क्या आप इसका उपयोग करने की सलाह देते हैं?
योगेन्द्र

4

बस डेबीसीपी के साथ डेढ़ दिन बर्बाद कर दिया। भले ही मैं नवीनतम DBCP रिलीज़ का उपयोग कर रहा हूं, मैं ठीक उसी तरह की समस्याओं में भाग गया जैसे j pimmel ने किया था। मैं DBCP की सिफारिश नहीं करता, विशेष रूप से यह पूल से बाहर कनेक्शन फेंकने की कमी है जब DB चला जाता है, DB वापस आने पर फिर से कनेक्ट करने में असमर्थता और DB में गतिशील रूप से कनेक्शन ऑब्जेक्ट्स को वापस जोड़ने में असमर्थता (यह हमेशा के लिए लटका रहता है) एक पोस्ट JDBCconnect I / O सॉकेट पढ़ें)

अब मैं C3P0 पर स्विच कर रहा हूं। मैंने पिछली परियोजनाओं में इसका उपयोग किया है और यह एक आकर्षण की तरह काम करता है और प्रदर्शन करता है।


4

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


3

एक अच्छा विकल्प जो उपयोग करने में आसान है वह डीबीपूल है

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

http://www.snaq.net/java/DBPool/


मैंने DBPool बनाम BoneCP को बेंचमार्क किया। DBPool getConnection () को अन्य चीजों के बीच सिंक्रनाइज़ करता है और BoneCP की तुलना में कहीं अधिक धीमा है (देखें: jolbox.com/forum/viewtopic.php?f=3&t=175 )।
wwadge

3

हम एक ऐसी स्थिति में आ गए जहां हमें कनेक्शन पूल शुरू करने की आवश्यकता थी और हमारे सामने 4 विकल्प थे।

  • DBCP2
  • C3P0
  • टॉमकैट JDBC
  • HikariCP

हमने अपने मानदंडों के आधार पर कुछ परीक्षण और तुलना की और HikariCP के लिए जाने का फैसला किया। इस लेख को पढ़ें जिसमें बताया गया है कि हमने HikariCP को क्यों चुना।


1

C3P0 को सर्वोत्तम तरीके से लागू करने के लिए इस उत्तर को जांचें

C3P0 :

एंटरप्राइज़ एप्लिकेशन के लिए, C3P0 सबसे अच्छा तरीका है। C3P0 JDDI-bindable DataSources के साथ पारंपरिक (DriverManager- आधारित) JDBC ड्राइवरों को बढ़ाने के लिए एक आसान-से-उपयोग की जाने वाली लाइब्रेरी है, जिसमें कनेक्शन और स्टेटमेंट पूलिंग को लागू करने वाले डेटा स्रोत शामिल हैं, जैसा कि jdbc3 कल्पना और jdbc2 std एक्सटेंशन द्वारा वर्णित है। C3P0 ने डीबी डिस्कनेक्ट और फिर से शुरू होने पर पारदर्शी पुनर्संरचना को भी मजबूती से संभाला जबकि डीबीसीपी ने कभी भी कनेक्शन को पुनर्प्राप्त नहीं किया यदि लिंक को इसके नीचे से निकाला गया था।

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

इससे भी बुरी बात यह है कि DBCP उस एप्लिकेशन को कनेक्शन ऑब्जेक्ट लौटा रहा था जिसके लिए अंतर्निहित परिवहन टूट गया था। C3p0 के लिए एक सामान्य उपयोग मामला अपाचे टोमाकट के साथ शामिल मानक DBCP कनेक्शन पूलिंग को बदलना है। अक्सर बार, एक प्रोग्रामर एक ऐसी स्थिति में चलेगा जहां कनेक्शन सही ढंग से DBCP कनेक्शन पूल में पुनर्नवीनीकरण नहीं किए जाते हैं और c3p0 इस मामले में एक मूल्यवान प्रतिस्थापन है।

वर्तमान अपडेट में C3P0 में कुछ शानदार विशेषताएं हैं। उन लोगों को दिया जाता है:

ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setMinPoolSize();
dataSource.setMaxPoolSize();
dataSource.setMaxIdleTime();
dataSource.setMaxStatements();
dataSource.setMaxStatementsPerConnection();
dataSource.setMaxIdleTimeExcessConnections();

यहां, अधिकतम और न्यूनतम पूल कनेक्शन की सीमा को परिभाषित करते हैं, जिसका अर्थ है कि यह आवेदन कितना न्यूनतम और अधिकतम कनेक्शन लेगा। MaxIdleTime()परिभाषित जब यह निष्क्रिय कनेक्शन जारी करेगा।

DBCP :

यह दृष्टिकोण भी अच्छा है, लेकिन कनेक्शन टाइमआउट और कनेक्शन रिहा करने जैसी कुछ कमियां हैं। C3P0 अच्छा है जब हम उत्परिवर्तित परियोजनाओं का उपयोग कर रहे हैं। हमारी परियोजनाओं में हमने DBCP का उपयोग करके एक साथ कई थ्रेड एग्जीक्यूटिव्स का उपयोग किया, फिर यदि हम अधिक थ्रेड एग्जीक्यूटिव का उपयोग करते हैं, तो हमें कनेक्शन टाइमआउट मिला। इसलिए हम c3p0 कॉन्फ़िगरेशन के साथ गए। मैं DBCP की सिफारिश नहीं करता, विशेष रूप से यह पूल से बाहर कनेक्शन फेंकने की कमी है जब DB चला जाता है, DB वापस आने पर फिर से कनेक्ट करने में असमर्थता और DB में गतिशील रूप से कनेक्शन ऑब्जेक्ट्स को वापस जोड़ने में असमर्थता (यह हमेशा के लिए लटका रहता है) एक पोस्ट JDBCconnect I / O सॉकेट पढ़ें)

धन्यवाद :)


1

मेरी सिफारिश है

hikari> druid> UCP> c3p0> DBCP

यह मेरे द्वारा परीक्षण किए जाने के आधार पर है - 20190202, मेरे स्थानीय परीक्षण वातावरण में (4GB mac / mysql in docker / pool minSize = 1, maxSize = 8), हाइक कनेक्शन प्राप्त करने के लिए 1024 थ्रेड्स x 1024 बार सेवा कर सकते हैं, प्रत्येक थ्रेड के लिए औसत समय। खत्म करने के लिए 1 या 2 मिलियन सेकंड है, जबकि c3p0 केवल 256 थ्रेड्स x 1024 बार सेवा कर सकता है और प्रत्येक थ्रेड के लिए औसत समय पहले से ही 21 मिलियन सेकंड है। (512 धागे विफल)।

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