2012-01-07 13 views
5

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

cpDs = new ComboPooledDataSource(); 
cpDs.setMinPoolSize(10); 
cpDs.setMaxPoolSize(20); 
cpDs.setMaxStatementsPerConnection(10); 

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

// 7 hours, less than MYSQL default value - 8 hours 
cpDs.setMaxIdleTime(25200); 
cpDs.setTestConnectionOnCheckout(true); 
cpDs.setPreferredTestQuery("select 1"); 

लेकिन मैं निरीक्षण हमेशा 10 कनेक्शन सो रहने/निष्क्रिय अवस्था देखते हैं कि (एसक्यूएल के माध्यम से 'शो processlist;') जब TimerTask नहीं चल रहा है, और मैं अक्सर प्रसिद्ध देख "स्पष्ट गतिरोध !!!" चेतावनी (जो कि अभी भी c3p0 प्रोजेक्ट http://sourceforge.net/tracker/?func=detail&aid=3432139&group_id=25357&atid=383690 में बग खुली स्थिति में है)।

तो क्या सभी गणना बंद करने का कोई तरीका है जब सभी गणना कार्य समाप्त हो जाते हैं और अगले दिन में कार्य फिर से किए जाते हैं जब कार्य फिर से किया जाता है? धन्यवाद।

सादर, जॉय

उत्तर

3

आप बंद करने के लिए कनेक्शन के सभी चाहते हैं, तो इसके अलावा 0 पर minPoolSize और initialPoolSize निर्धारित करते हैं, मैं 600 (10 मिनट) की तरह एक छोटे मूल्य के लिए maxIdleTime को कम करने का सुझाव देते हैं। सेटिंग्स के इस संयोजन से पूल आपके कर्मचारियों के समाप्त होने के तुरंत बाद "निकालने" को सक्षम कर देगा।

आप ComboPooledDataSource में प्रकट reset विधियों में से किसी एक का उपयोग करके बंद करने के लिए सभी कनेक्शन को भी मजबूर कर सकते हैं, लेकिन यदि पूल सही तरीके से कॉन्फ़िगर किया गया है जो आवश्यक नहीं होना चाहिए।

+0

धन्यवाद, रॉब, आपका सुझाव बहुत उपयोगी है! मैंने कोशिश की, और maxIdleTime पारित होने के बाद सभी कनेक्शन बंद हो गए। बहुत अच्छा! –

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