java - कैसे maxIdleTimeExcessConnections c3p0 में maxIdleTime से अलग है?
jdbc connection-pooling (2)
मैं अपने c3p0 कनेक्शन पूल को विन्यस्त करना चाहता हूं ताकि कम से कम 2 कनेक्शन हमेशा सक्रिय हो जाएं, अधिकतम 5 में, और पहले 2 के पिछले निष्क्रिय कनेक्शन उचित समय-समय पर समाप्त हो जाएंगे (एक घंटा कहें)।
दस्तावेज को छोड़कर यह सब सरल लगता है, यह दर्शाता है कि maxIdleTime
और maxIdleTimeExcessConnections
maxIdleTime
बीच कोई अंतर नहीं है, जो मुझे भ्रमित कर रहा है
मूल पूल विन्यास में कहा गया है:
मिनपुल साइज़ और मैक्सपूल साइज़ के बीच की सीमा के भीतर, पूल में कनेक्शन की संख्या उपयोग पैटर्न के अनुसार भिन्न होती है। कनेक्शन्स की संख्या बढ़ जाती है, जब भी किसी उपयोगकर्ता द्वारा कनेक्शन का अनुरोध किया जाता है, कोई कनेक्शन उपलब्ध नहीं है, और पूल अभी तक कनेक्शन प्रबंधित की संख्या में maxPoolSize तक नहीं पहुंचा है। चूंकि कनेक्शन अधिग्रहण बहुत धीमा है, प्रत्येक ग्राहक को एक नए कनेक्शन की प्रतीक्षा करने के बजाय एक अधिग्रहण को उकसाने के लिए मजबूर होने के बजाय, बैचों में कनेक्शन की संख्या को बढ़ाने के लिए लगभग हमेशा उपयोगी होता है, जब लोड बढ़ता है। अधिग्रहण यह निर्धारित करता है कि कनेक्शन कनेक्शन से बाहर चलने के दौरान कितने कनेक्शन एक c3p0 पूल प्राप्त करने का प्रयास करेंगे। (अधिग्रहण के बावजूद, पूल कभी भी maxPoolSize को पार करने की अनुमति नहीं देगा।)
और minPoolSize
उपयोग:
किसी भी समय कनेक्शन की न्यूनतम संख्या एक पूल बनाए रखेगी।
ठीक है बढ़िया। और कनेक्शन के समय को कॉन्फ़िगर करने के लिए:
maxIdleTimeExcessConnections c3p0 पूल द्वारा आयोजित कनेक्शन की संख्या को कम करने के बारे में है, जब पूल लोड के तहत नहीं है डिफ़ॉल्ट रूप से, c3p0 पूल लोड के तहत बढ़ते हैं, लेकिन केवल कनेक्शन को कनेक्शन कनेक्शन विफल करने पर समाप्त हो जाते हैं या ऊपर वर्णित पैरामीटर के माध्यम से समाप्त हो जाते हैं। कुछ प्रयोक्ता चाहते हैं कि उनके पुलों को एक बड़े पूल आकार के लिए उपयोग में एक स्पाइक के बाद जल्दी से अनावश्यक कनेक्शन छोड़ दें। आप maxIdleTimeExcessConnections को maxIdleTime की तुलना में बहुत कम मान में प्राप्त कर सकते हैं, यदि वे कम समय की तुलना में अधिक बेकार बैठते हैं, तो अपने सेट न्यूनतम आकार के बाहर कनेक्शन को मजबूर कर सकते हैं।
तो यह निहित है कि minPoolSize
केवल मामलों जब maxIdleTimeExcessConnections
के साथ संयोजन के रूप में उपयोग किया जाता है, अन्यथा, यह पूरी तरह से पूरी तरह से ध्यान नहीं दिया जाएगा
maxIdleTime
लिए दस्तावेज की पुष्टि करना maxIdleTime
कोई उल्लेख नहीं करता है:
एक कनेक्शन जुड़ाव किया जा सकता है लेकिन अप्रयुक्त होने से पहले उपयोग नहीं किया जा सकता है। शून्य का मतलब है कि बेकार कनेक्शन कभी भी समाप्त नहीं होंगे
और maxIdleTimeExcessConnections
समझ में आता है:
मिनटों की संख्या जो कि minPoolSize से अधिक कनेक्शनों को बंद किए जाने से पहले पूल में निष्क्रिय रहने की अनुमति होनी चाहिए। खुले कनेक्शन की संख्या को आक्रामक रूप से कम करने की इच्छा रखने वाले अनुप्रयोगों के लिए, न्यूनतम पूल की ओर वापस पूल को सिकुड़ते हुए, यदि स्पाइक के बाद, लोड स्तर कम हो जाता है और अधिग्रहीत कनेक्शन्स की आवश्यकता नहीं रह गई है यदि अधिकतम इडले टाइम सेट किया गया है, तो पैरामीटर का कोई प्रभाव होना चाहिए, तो maxIdleTimeExcessConnections छोटा होना चाहिए। शून्य का अर्थ है कोई लागू नहीं, अतिरिक्त कनेक्शन बाहर idled नहीं हैं।
मुझे लगता है कि यह वास्तव में अजीब है कि minPoolSize
, एक बुनियादी सुविधा, केवल जब मैं एक और अधिक उन्नत सुविधा के लिए लगता है के साथ प्रयोग मामलों। क्या यह सब सही है?
क्या सावधान और वकील पढ़ा!
लेकिन नहीं, यह सही नहीं है।
एक कनेक्शन मर सकते हैं कई तरीके हैं जैसा आप उद्धृत करते हैं:
c3p0 पूल ... सिकोड़ें यदि कनेक्शन कनेक्शन परीक्षण विफल हो जाते हैं या ऊपर वर्णित मापदंडों के माध्यम से समाप्त हो गया है।
"ऊपर वर्णित पैरामीटर" में maxConnectionAge
शामिल हैं, maxIdleTime
, और maxIdleTimeExcessConnections
। कनेक्शनों को पूल से भी हटाया जा सकता है क्योंकि वे निष्क्रिय होने के दौरान कनेक्शन परीक्षण विफल होते हैं (निष्क्रिय idleConnectionTestPeriod
देखें), क्योंकि वे चेक-इन या चेक-आउट ( testConnectionOnCheckin
, testConnectionOnCheckout
) पर विफल होते हैं, या क्योंकि वे एक अपवाद ग्राहक उपयोग के पाठ्यक्रम
हालांकि एक पूल सिकुड़ता है, minPoolSize
मामलों, क्योंकि पूल पूल से कम हो minPoolSize
, नष्ट कर दिया गया सम्पर्क तब तक minPoolSize
जब तक minPoolSize
बहाल नहीं किया जाएगा।
maxIdleTimeExcessConnections
बारे में अद्वितीय क्या है यह है कि यह व्यवहार सीधे minPoolSize
सापेक्ष पूल के आकार पर आकस्मिक है अन्य सभी मापदंडों और परीक्षण सिर्फ उनकी बात करते हैं अगर उनकी चीज़ पूल को कुछ कम पूल से लाने के लिए minPoolSize
, तो c3p0 स्वतः पूल को वापस minPoolSize
लेकिन maxIdleTimeExcessConnections
अलग है यह केवल तब होता है जब पूल minPoolSize
से बड़ा होता है।
जैसा कि आप कहते हैं, maxIdleTimeExcessConnections
एक उन्नत सुविधा है अधिकांश उपयोगकर्ता कभी नहीं करते हैं और इसकी आवश्यकता कभी नहीं करते हैं इसे जोड़ा गया था क्योंकि कुछ उपयोगकर्ता पूल को आकस्मिक रूप से minPoolSize पर वापस हटना चाहते थे, लेकिन ऐसा करने से बहुत कम बिना शर्त maxIdleTime
कारण बिना कनेक्शन के माध्यम से अनावश्यक रूप से मंथन हो जाता है, चूंकि एक minPoolSize
पूल में भी कनेक्शन निरंतर समाप्त हो जाते हैं और प्रतिस्थापित होते हैं एक लंबी या नॉन- maxIdleTime
सेट करने के दौरान, एक छोटी maxIdleTimeExcessConnections
सेट करते हुए पूल की हिट minPoolSize
बाद कनेक्शन के माध्यम से मंथन के बिना तेज़, आक्रामक सिकुड़ते का वांछित परिणाम minPoolSize
।
लेकिन बिना भी maxIdleTimeExcessConnections
सेट, minPoolSize
बहुत मायने रखती है कनेक्शन नष्ट हो जाते हैं और पूल से खारिज हो जाते हैं, और minPoolSize
नीचे एक minPoolSize
निर्धारित करता है जिससे नष्ट हो जाता है कनेक्शन स्वचालित रूप से प्रतिस्थापित हो जाएंगे, भले ही पूल विस्तार को भड़काने के लिए कोई ग्राहक लोड न हो।
मैं उम्मीद करता हूं कि इस बात में कोई तुक होगी!
स्टीव वॉकडमैन द्वारा अच्छा जवाब, मैं सिर्फ एक छोटा जवाब जोड़ना चाहता हूं:
अंतर यह है कि अधिकतम इडले टाइम मिनिपल minPoolSize
डी पूल में भी निष्क्रिय कनेक्शन को बदल देगा, जबकि maxIdleTimeExcessConnections
नहीं होगा