2012-07-31 11 views
5

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

Caused by: java.sql.SQLException: An attempt by a client to checkout a Connection has timed out. 

हम डेटाबेस के रूप में mysql का उपयोग करते हैं। मेरे शोध पर, मुझे पता चला कि MySQL 8 घंटे या उससे भी बाद के कनेक्शन कनेक्शन बनाता है। यह संभव हो सकता है कि कनेक्शन पूल क्लाइंट के लिए एक पुराना कनेक्शन दे रहा है और इसलिए क्लाइंट के लिए कनेक्शन टाइमआउट अपवाद।

वर्तमान में, हमारे पास C3Po में कॉन्फ़िगर कोई कनेक्शन परीक्षण नहीं है। आइए कहें, अगर मैं क्लाइंट को पूल द्वारा दिए जाने से पहले कनेक्शन का परीक्षण करने के लिए IdleTestPeriod का उपयोग करता हूं। तो क्या होता है यदि मेरे सभी कनेक्शन एक समय पर परीक्षण में असफल हो जाते हैं? क्या उन असफल कनेक्शन पूल से हटा दिए जाएंगे और नए सक्रिय कनेक्शन फिर से उत्पन्न किए जाएंगे?

वर्तमान में, यह c3p0 सेटिंग्स है जिसका हम उपयोग कर रहे हैं। इस समस्या के लिए कोई अन्य कारण संभव है?

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> 
     <property name="driverClass" value="${----}"/> 
     <property name="jdbcUrl" value="${----}"/> 
     <property name="user" value="${----}"/> 
     <property name="password" value="${------}"/> 
     <property name="minPoolSize" value="5"/> 
     <property name="acquireIncrement" value="5" /> 
     <property name="maxPoolSize" value="125" /> 
     <property name="maxStatements" value="10" /> 
     <property name="maxIdleTime" value="180" /> 
     <property name="maxIdleTimeExcessConnections" value="30" /> 
     <property name="checkoutTimeout" value="3000" /> 
     <property name="preferredTestQuery" value="SELECT 1" /> 
    </bean> 

मदद

उत्तर

1

MySQL Java Connector में उच्च उपलब्धता और क्लस्टरिंग के अनुभाग में, गुण पर एक नज़र के लिए धन्यवाद; विशेष रूप से autoReconnect और autoReconnetForPools। अपने जेडीबीसी कनेक्शन यूआरएल में गुणों का प्रयोग करें। उन्होंने MySQL, Hibernate, और C3P0 का उपयोग करते समय पहले मेरी मदद की है। उम्मीद है कि यह मदद करता है।

9

तो आपके पास 3 सेकंड (3000 एमसीईसी) सेट का चेकआउटटाइमआउट है। यह आपके विचार को अपवाद है। ग्राहकों को केवल पूल से कनेक्शन चेकआउट करने के लिए तीन सेकंड तक प्रतीक्षा करने की अनुमति है; यदि तीन सेकंड पर्याप्त नहीं हैं, तो वे आपकी अपवाद देखते हैं।

सवाल यह है कि ग्राहक कनेक्शन प्राप्त करने में इतने लंबे समय क्यों ले रहे हैं? आम तौर पर कनेक्शन की जांच करना एक बहुत तेज़ ऑपरेशन है। लेकिन यदि सभी कनेक्शन चेक आउट किए जाते हैं, तो क्लाइंट को डेटाबेस से कनेक्शन धीमे (धीमे) इंतजार करना पड़ता है।

आपके पास पूल बहुत आक्रामक रूप से कनेक्शन को कॉन्फ़िगर करने के लिए कॉन्फ़िगर किया गया है। MinPoolSize = 5 से ऊपर के किसी भी कनेक्शन को नष्ट कर दिया जाएगा यदि वे maxIdleTimeExcessConnections = 30 सेकंड से अधिक के लिए निष्क्रिय हैं। फिर भी आपका पूल बड़े पैमाने पर विस्फोटों के लिए कॉन्फ़िगर किया गया है: maxPoolSize = 125। मान लीजिए कि आपका ऐप थोड़ी देर के लिए शांत है, और उसके बाद ग्राहकों से कनेक्शन अनुरोधों का विस्फोट हो जाता है। पूल जल्दी से कनेक्शन से बाहर हो जाएगा और अधिग्रहण = 5 के विस्फोटों में अधिग्रहण करना शुरू कर देगा। लेकिन अगर अचानक 25 ग्राहक हैं और पूल में केवल 5 कनेक्शन हैं, तो यह असंभव नहीं है कि 25 वें ग्राहक कनेक्शन प्राप्त करने से पहले समय निकाल सकें।

आप बहुत कुछ कर सकते हैं। ये बदलाव अलग-अलग हैं, आप फिट बैठकर मिश्रण या मिलान कर सकते हैं।

1) कूल निष्क्रिय "अतिरिक्त" कनेक्शन कम आक्रामक रूप से निष्क्रिय होते हैं, ताकि आम तौर पर आपके पूल में अनुरोधों के विस्फोटों की सेवा करने की कुछ क्षमता हो। आप maxIdleTimeExcessConnections को पूरी तरह से छोड़ सकते हैं, और maxIdleTime = 180 सेकंड के दुरुपयोग के बाद धीरे-धीरे कनेक्शन को चलो। (डाउनसाइड? निष्क्रियता की अवधि के दौरान लंबे समय तक एक बड़ा संसाधन पदचिह्न)

2) न्यूनतम मूल्य पर minPoolSize सेट करें, ताकि यह संभावना न हो कि पूल गतिविधि की एक फट देखेंगे जिसके लिए बहुत कम कनेक्शन हैं (डाउनसाइड बड़ा स्थायी संसाधन पदचिह्न।)

3) अपनी कॉन्फ़िगरेशन से चेकआउट टाइमआउट छोड़ें। c3p0 का डिफ़ॉल्ट क्लाइंट को कनेक्शन के लिए अनिश्चित काल तक प्रतीक्षा करने की अनुमति देना है। (डाउनसाइड? हो सकता है कि आप संभावित सफलता की प्रतीक्षा करने के बजाय ग्राहकों को विफलता की तुरंत रिपोर्ट करने के लिए पसंद करते हैं।)

मुझे नहीं लगता कि आप जिस समस्या को देख रहे हैं वह कनेक्शन परीक्षण या MySQL टाइमआउट प्रति से अधिक है, लेकिन इसका मतलब यह नहीं है कि आपको उन मुद्दों से निपटना नहीं चाहिए। मैं MySQL रीकनेक्ट मुद्दे पर नोहेह की सलाह को रोक दूंगा। (मैं एक बड़ा MySQL उपयोगकर्ता नहीं हूं।) आपको कनेक्शन परीक्षण लागू करने पर विचार करना चाहिए। आपके पास एक पसंदीदाTestQuery है, इसलिए परीक्षण उचित रूप से तेज़ होना चाहिए। मेरी सामान्य पसंद testConnectionOnCheckin और idleConnectionTestPeriod का उपयोग करना है। http://www.mchange.com/projects/c3p0/#configuring_connection_testing

शुभकामनाएं देखें!

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