Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

c3p0 maxIdleTime mysql के Wait_timeout के समान है?

सबसे पहले mysql के गुणों को समझते हैं।

  • interactive_timeout :mysql शेल सेशन के लिए इंटरएक्टिव टाइम आउट सेकंड में mysqldump या mysql कमांड लाइन टूल्स की तरह। कनेक्शन सुप्त अवस्था में हैं। अधिकांश समय यह उच्च मान पर सेट होता है क्योंकि आप नहीं चाहते कि जब आप mysql cli पर कुछ कर रहे हों तो यह डिस्कनेक्ट हो जाए।
  • wait_timeout :निष्क्रियता के दौरान सेकंड की मात्रा जो MySQL प्रतीक्षा करेगा इससे पहले कि यह एक गैर-संवादात्मक कनेक्शन पर एक कनेक्शन को सेकंड में बंद कर देगा। उदाहरण:जावा से जुड़ा हुआ है। कनेक्शन निष्क्रिय अवस्था में हैं।

अब आइए c3po गुणों को समझते हैं और इसका DB प्रॉप्स के साथ संबंध है। (मैं सिर्फ आपके प्रश्न से कॉपी करने वाला हूं)

यह संदर्भित करता है कि कनेक्शन ऑब्जेक्ट कितने समय तक प्रयोग करने योग्य हो सकता है और पूल में उपलब्ध होगा। एक बार टाइमआउट खत्म हो जाने पर c3po इसे नष्ट कर देगा या इसे रीसायकल करेगा।

अब समस्या तब आती है जब आपके पास maxIdleTime . है उच्चतर तो wait_timeout मान लें कि mxIdleTime : 50 सेकंड और wait_timeout : 40 s तो एक संभावना है कि आपको Connection time out exception: Broken Pipe यदि आप अंतिम 10 सेकंड में कोई ऑपरेशन करने का प्रयास करते हैं। तो maxIdelTime हमेशा कम होना चाहिए wait_timeout

maxIdleTime के बजाय आप निम्न गुण कर सकते हैं।

  • idleConnectionTestPeriod एक सीमा निर्धारित करता है कि कोई कनेक्शन परीक्षण करने से पहले कितने समय तक निष्क्रिय रहेगा। बिना preferredTestQuery . के , डिफ़ॉल्ट DatabaseMetaData.getTables() . है - जो डेटाबेस अज्ञेयवादी है, और हालांकि एक अपेक्षाकृत महंगी कॉल, अपेक्षाकृत छोटे डेटाबेस के लिए शायद ठीक है। यदि आप प्रदर्शन के बारे में पागल हैं, तो अपने डेटाबेस के लिए विशिष्ट क्वेरी का उपयोग करें (i.e. preferredTestQuery="SELECT 1")
  • maxIdleTimeExcessConnections गतिविधि में वृद्धि के बाद कनेक्शनकाउंट बैकडाउन को minPoolSize पर वापस लाएगा।

कृपया ध्यान दें कि पूल की कोई भी संपत्ति (उदा. maxIdleTime .) ) केवल कनेक्शन को प्रभावित करता है जो पूल में हैं यानी अगर हाइबरनेट ने एक कनेक्शन हासिल कर लिया है और इसे maxIdleTime की तुलना में निष्क्रिय रखता है और फिर कोई ऑपरेशन करने की कोशिश करता है तो आपको "टूटा हुआ पाइप" मिलेगा

कम wait_timeout होना अच्छा है MySQL पर लेकिन यह हमेशा सही नहीं होता है जब आपके पास पहले से निर्मित एक एप्लिकेशन होता है। आपको इसे कम करने से पहले यह सुनिश्चित करना होगा कि आपके एप्लिकेशन में आप कनेक्शन को अधिक के लिए खुला नहीं रख रहे हैं wait_time बाहर।

आपको यह भी विचार करना होगा कि कनेक्शन प्राप्त करना महंगा काम है और यदि प्रतीक्षा समय बहुत कम है तो यह कनेक्शन पूल होने के पूरे उद्देश्य को हरा देता है, क्योंकि यह अक्सर कनेक्शन प्राप्त करने का प्रयास करेगा।

यह विशेष रूप से महत्वपूर्ण है जब आप मैन्युअल रूप से कनेक्शन प्रबंधन नहीं कर रहे हैं उदाहरण के लिए जब आप स्प्रिंग ट्रांसनेशनल एपीआई का उपयोग करते हैं। जब आप @Transaction . दर्ज करते हैं तो स्प्रिंग लेनदेन शुरू करता है एनोटेट विधि इसलिए यह पूल से कनेक्शन प्राप्त करती है। यदि आप कोई वेब सेवा कॉल कर रहे हैं या कुछ फाइल पढ़ रहे हैं जिसमें प्रतीक्षा_टाइम से अधिक समय लगेगा तो आपको अपवाद मिलेगा।

मैंने एक बार इस मुद्दे का सामना किया है।

मेरी एक परियोजना में मेरे पास एक क्रॉन था जो ग्राहकों के लिए ऑर्डर प्रोसेसिंग करेगा। इसे तेज करने के लिए मैंने बैच प्रोसेसिंग का इस्तेमाल किया। अब एक बार जब मैं ग्राहकों का एक बैच पुनर्प्राप्त करता हूं और कुछ प्रसंस्करण करता हूं (कोई डीबी कॉल नहीं)। जब मैं सभी ऑर्डर सहेजने की कोशिश करता हूं तो मुझे टूटा हुआ पाइप अपवाद मिलता था। समस्या यह थी कि मेरा वेट_टाइमआउट 1 मिनट का था और ऑर्डर प्रोसेसिंग में अधिक समय लग रहा था। इसलिए हमें इसे बढ़ाकर 2 मिनट करना पड़ा। मैं बैच के आकार को कम कर सकता था लेकिन वह समग्र प्रसंस्करण को धीमा कर रहा था।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL तालिका से अद्वितीय बाधा छोड़ना

  2. क्या 'ब्लैकहोल' टेबल खराब है?

  3. बेस टेबल या व्यू नहीं मिला:1146 टेबल लारवेल 5

  4. सिम्फनी:ड्राइवर में एक अपवाद हुआ:mysql के साथ ड्राइवर नहीं मिला

  5. mysql में उपयोगकर्ताओं को उनके अंकों के आधार पर रैंक करें