2013-06-05 6 views
5

मैं कई प्रश्नों से गुजर चुका हूं, this कुछ हद तक संबंधित है लेकिन मेरे प्रश्न का उत्तर नहीं देता है।क्या सी 3 पी 0 कनेक्शन पूलिंग अधिकतम पूल आकार सुनिश्चित करता है?

क्या सी 3 पी 0 कनेक्शन पूलिंग maxPoolSize सुनिश्चित करता है कि किसी निश्चित समय पर कनेक्शन की संख्या कभी भी इस सीमा से अधिक न हो? क्या होगा यदि maxPoolSize=5 और 10 उपयोगकर्ता एक ही समय में ऐप का उपयोग शुरू करते हैं?

मेरा ऐप। विन्यास

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> 
     <property name="driverClass"><value>${database.driverClassName}</value>/property> 
     <property name="jdbcUrl"><value>${database.url}</value></property> 
     <property name="user"><value>${database.username}</value></property> 
     <property name="password"><value>${database.password}</value></property> 
     <property name="initialPoolSize"><value>${database.initialPoolSize}</value>/property> 
     <property name="minPoolSize"><value>${database.minPoolSize}</value></property> 
     <property name="maxPoolSize"><value>${database.maxPoolSize}</value></property> 
     <property name="idleConnectionTestPeriod"><value>200</value></property> 
     <property name="acquireIncrement"><value>1</value></property> 
     <property name="maxStatements"><value>0</value></property> 
     <property name="numHelperThreads"><value>3</value></property> 
    </bean> 

    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
     <property name="dataSource" ref="dataSource"/>    
    </bean> 

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
     <property name="entityManagerFactory" ref="entityManagerFactory"/> 
     <property name="dataSource" ref="dataSource"/> 
    </bean> 

उत्तर

11

यह datasources और कनेक्शन पूल के बीच अंतर करना महत्वपूर्ण है।

maxPoolSize को प्रति-पूल आधार पर c3p0 द्वारा लागू किया गया है। लेकिन एक ही डेटासोर्स में एकाधिक कनेक्शन पूल हो सकते हैं, क्योंकि प्रमाणीकरण प्रमाण-पत्रों के प्रत्येक सेट के लिए एक विशिष्ट पूल है (और होना चाहिए)। यदि केवल डिफ़ॉल्ट dataSource.getConnection() विधि को कभी भी बुलाया जाता है, तो अधिकतमपुस्तिका पूल कनेक्शन प्राप्त करने और प्रबंधित करने वाले कनेक्शन की अधिकतम संख्या होगी। हालांकि, यदि कनेक्शन dataSource.getConnection(user, password) का उपयोग करके अधिग्रहित किए जाते हैं, तो डेटासोर्स (maxPoolSize * num_distinct_users) कनेक्शन तक हो सकता है।

अपने विशिष्ट प्रश्न का उत्तर देने के लिए, यदि maxPoolSize 5 और 10 क्लाइंट एक साथ c3p0 डेटासोर्स हिट करते हैं, तो उनमें से 5 से अधिक पहले कनेक्शन नहीं प्राप्त करेंगे। शेष ग्राहक wait() करेंगे जब तक कि कनेक्शन वापस नहीं आते (या c3p0.checkoutTimeout की समय सीमा समाप्त हो गई है)।

कुछ चेतावनी: c3p0 ऊपर वर्णित अनुसार maxPoolSize लागू करता है। लेकिन इस बात की कोई गारंटी नहीं है कि, भले ही केवल एक ही प्रति-पूल पूल का उपयोग किया जाए, आप कभी-कभी maxPoolSize कनेक्शन से अधिक नहीं देख पाएंगे। उदाहरण के लिए, c3p0 कनेक्शन को अतुल्यकालिक रूप से समाप्त और नष्ट कर देता है। जहां तक ​​c3p0 का संबंध है, एक कनेक्शन को क्लाइंट के लिए अनुपलब्ध कर दिया गया है और विनाश के लिए चिह्नित किया गया है, न कि जब इसे वास्तव में नष्ट कर दिया गया है। इसलिए, यह संभव है कि, यदि maxPoolSize 5 है, तो आप कभी-कभी डेटाबेस पर 6 खुले कनेक्शन का निरीक्षण करेंगे। पूल में 5 कनेक्शन सक्रिय होंगे, जबकि 6 वें विनाश के लिए कतार में है लेकिन अभी तक नष्ट नहीं हुआ है।

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

इसलिए, अगर आपके पास maxPoolSize कनेक्शन के साथ एक पूल की जाँच की, और फिर एक विन्यास पैरामीटर को बदलने के लिए, आप क्षणिक, ऊपर (2 * maxPoolSize) के एक कील देख सकते हैं यदि नया पूल से बाहर की जाँच की कनेक्शन से पहले यातायात के बहुत से मारा जाता है पुराना पूल वापस कर दिया गया है। व्यावहारिक रूप से, यह शायद ही कभी एक मुद्दा है, क्योंकि गतिशील पुनर्गठन इतना आम नहीं है, और कनेक्शन चेकआउट होना चाहिए और आमतौर पर बहुत संक्षिप्त होना चाहिए, इसलिए पुराने पूल कनेक्शन तेजी से गायब हो जाते हैं। लेकिन यह हो सकता है!

मुझे उम्मीद है कि इससे मदद मिलती है।

ps acquireIncrement 1 से1 से बड़ा कुछ सेट है, इसका मतलब है कि कोई कनेक्शन मांग से पहले प्रीफेच नहीं किया गया है, इसलिए जब भी लोड बढ़ता है तो कुछ थ्रेड सीधे कनेक्शन अधिग्रहण की विलम्ब का अनुभव करेंगे।

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