2013-01-22 50 views
20

साथ पूलिंग मैं एक जावा आवेदन (इस में कोई कंटेनर द्वारा प्रदत्त डेटा स्रोत) में कनेक्शन पूलिंग सक्षम करने के लिए Apache Commons DBCP उपयोग करना चाहते हैं। वेब Apache site सहित के कई साइटों में - पुस्तकालय के उपयोग के इस स्निपेट में आधारित है:कनेक्शन अपाचे DBCP

BasicDataSource ds = new BasicDataSource(); 
ds.setDriverClassName("oracle.jdbc.driver.OracleDriver"); 
ds.setUsername("scott"); 
ds.setPassword("tiger"); 
ds.setUrl(connectURI); 

तो फिर तुम विधि getConnection() के माध्यम से अपने DB कनेक्शन मिलता है। लेकिन अन्य साइटों पर Apache Site also -और - डेटा स्रोत उदाहरण इस के माध्यम से किया जाता है:

ConnectionFactory connectionFactory = new DriverManagerConnectionFactory(connectURI,null); 
PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory(connectionFactory); 
ObjectPool objectPool = new GenericObjectPool(poolableConnectionFactory); 
PoolingDataSource dataSource = new PoolingDataSource(objectPool); 

उन दोनों के बीच क्या अंतर है? मैं कनेक्शन पूलिंग का उपयोग कर रहा BasicDataSource साथ, या मैं PoolingDataSource का एक उदाहरण की जरूरत कनेक्शन पूलिंग के साथ काम करने? BasicDataSource थ्रेड-सुरक्षित है (क्या मैं इसे क्लास एट्रिब्यूट के रूप में उपयोग कर सकता हूं) या मुझे इसकी पहुंच सिंक्रनाइज़ करने की आवश्यकता है?

उत्तर

22

BasicDataSource बुनियादी जरूरतों के लिए सब कुछ है। यह आंतरिक रूप से एक पूल योग्य डेटा स्रोत और ऑब्जेक्टपूल बनाता है।

PoolableDataSource एक प्रदान की ObjectPool का उपयोग कर डेटा स्रोत इंटरफ़ेस लागू करता है। PoolingDataSource कनेक्शन की परवाह करता है और ऑब्जेक्टपूल इस ऑब्जेक्ट को पकड़ने और गिनने की परवाह करता है।

मैं BasicDataSource का उपयोग कर की सिफारिश करेंगे। केवल, यदि आपको वास्तव में कुछ विशेष की आवश्यकता है तो आप ऑब्जेक्टपूल के दूसरे कार्यान्वयन के साथ पूलिंग डेटासेट का उपयोग कर सकते हैं, लेकिन यह बहुत ही दुर्लभ और विशिष्ट होगा।

बेसिकडेटा स्रोत थ्रेड-सुरक्षित है, लेकिन आपको थ्रेड-सुरक्षा सुनिश्चित करने के लिए सीधे सुरक्षित फ़ील्ड तक पहुंचने के बजाय उपयुक्त एक्सेसर्स का उपयोग करने की देखभाल करनी चाहिए।

+0

क्या आप मतलब है से बनाया जाता है "उचित एक्सेसर्स" के साथ? सिंक्रनाइज़ ब्लॉक? –

+0

BasicDataSource थ्रेड-सुरक्षित है, क्योंकि सभी चर सिंक्रनाइज़ के माध्यम से पढ़े/लिखे जाते हैं। तो, मुझे नहीं लगता कि आपको सिंक्रनाइज़ ब्लॉक का उपयोग करने की आवश्यकता है। यदि आप इस कक्षा को विस्तारित कर रहे हैं तो आपको केवल थ्रेड-सुरक्षा सुनिश्चित करने के लिए सुरक्षित फ़ील्ड तक पहुंचने के बजाय उपयुक्त एक्सेसर्स का उपयोग करने की देखभाल करनी चाहिए, लेकिन आपको सिंक्रनाइज़ ब्लॉक का उपयोग करने की आवश्यकता नहीं है। – ivi

23

यह ऊपर से ivi के उत्तर में एक (बड़ी) सहायक टिप्पणी का अधिक है, लेकिन स्नैपशॉट जोड़ने की आवश्यकता के कारण इसे उत्तर के रूप में पोस्ट कर रहा हूं।

BasicDataSource बुनियादी जरूरतों के लिए सब कुछ है। यह आंतरिक रूप से पूलबलडेटा स्रोत और ऑब्जेक्टपूल बनाता है।

मैं BasicDataSource में कोड कि बयान (जो पता चला है सच होना) को पुष्ट करने को देखने के लिए करना चाहता था। मुझे उम्मीद है कि निम्नलिखित स्नैपशॉट भविष्य के पाठकों की सहायता करेंगे।


निम्नलिखित तब होता है जब पहली बार कोई basicDatasource.getConnection() करता है। डेटा स्रोत के आसपास पहली बार इस प्रकार बनाई गई है:

enter image description here


  1. यह कच्चे connectionFactory है।

  2. यह जेनेरिक ऑब्जेक्ट पूल ('कनेक्शनपूल') है जो शेष चरणों में उपयोग किया जाता है। enter image description here

  3. यह उपरोक्त दो (connectionFactory + एक वस्तु पूल) एक PoolableConnectionFactory बनाने के लिए को जोड़ती है।
    enter image description here

    गौरतलब है कि PoolableConnectionFactory के निर्माण के दौरान, connectionPool connectionFactory के साथ ऐसा तरह जुड़ा हुआ है:
    enter image description here

  4. अंत में, एक PoolingDataSource connectionPool
    enter image description here