2009-12-08 10 views
7

में कनेक्शन दोबारा खोलना नहीं है मैंने कनेक्शन पर माइस्क्ल टाइमआउट के बाद कनेक्शन कनेक्शन का उपयोग करने के लिए टोमकैट स्थापित किया है, पहले पूल में खुलने वाले कनेक्शन खोले नहीं गए हैं.यह मेरी संदर्भ.एक्सएमएल फ़ाइल जैसा दिखता है:जेडीबीसी कनेक्शन पूल टोमकैट

<Resource name="jdbc/hpsgDB" auth="Container" type="javax.sql.DataSource" 
      maxActive="5" maxIdle="3" maxWait="10000" 
      username="uname" password="password" driverClassName="com.mysql.jdbc.Driver" 
      url="jdbc:mysql://localhost:3306/hpsgdb?autoReconnect=true"/> 

जैसा कि आप देख सकते हैं कि मैंने ऑटो रीकनेक्ट को सत्य के रूप में अभी तक शामिल नहीं किया है। मैंने 8 घंटों के बाद डेटाबेस पर प्रक्रिया की जांच की है, जो समय समाप्त हो गया है। यदि कोई मदद कर सकता है तो कृपया मेरी मदद करें क्योंकि यह कुछ महीनों के लिए एक समस्या है, लेकिन अभी तक मेरे सॉफ़्टवेयर के चलते जल्द ही जरूरी है।
अग्रिम डीन चेस्टर

उत्तर

6

सत्यापन क्वेरी विशेषता जोड़ने का प्रयास करें। इस तरह के समय समाप्ति के बाद कनेक्शन को स्वचालित रूप से बंद करने और फिर से खोलने का प्रभाव होना चाहिए:

validationQuery="SELECT 1" 
+0

मुझे यह समाधान किसी अन्य मंच पर मिला है और पहले से ही यह किया है। – Dean

+0

validationQuery पर्याप्त नहीं है। कृपया पढ़ें: http://leakfromjavaheap.blogspot.com/2013/11/robust-db-connection-pool-configuration.html –

+0

'testWhileIdle' और' test-on-उधार 'गुण सत्यापन का उपयोग करेंगे –

1

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

5

सबसे पहले, autoReconnect संपत्ति से छुटकारा पाएं। आपको कनेक्शन पूल के साथ इसकी आवश्यकता नहीं है और समस्याएं हो सकती हैं।

दूसरा, सुनिश्चित करें कि आप पास सभी संसाधनों (Connection, Statement और ResultSet) finally ब्लॉक में अपने JDBC- कोड में।

मुझे यकीन नहीं है कि यह आपके मामले में लागू होता है, लेकिन शुरुआत करने वालों के बीच एक आम गलतफहमी यह है कि उन्हें लगता है कि पूल किए गए कनेक्शन के मामले में आपको उन संसाधनों को बंद करने की आवश्यकता नहीं है। यह असत्य है। एक pooled कनेक्शन, एक आवरण (डेकोरेटर) जो एक हल्के से बदल दिया close() विधि है एक कनेक्शन के आसपास जो मोटे तौर पर की तरह

public void close() throws SQLException { 
    if (this.connection is still active) { 
     do not close this.connection, but just return it to pool for reuse; 
    } else { 
     actually invoke this.connection.close(); 
    } 
} 
दूसरे शब्दों के साथ

देखो है को बंद करने के लिए उन्हें pooled कनेक्शन अप को मुक्त कर देते हैं, जिससे कि इसे वापस रखा जा सकता है भविष्य में पुन: उपयोग के लिए पूल में। यदि आप उन्हें बंद किए बिना कनेक्शन प्राप्त करते हैं, तो पूल जल्द से जल्द या बाद में कनेक्शन से बाहर हो जाएगा।

0

आपकी कॉन्फ़िगरेशन के साथ, यदि यह निष्क्रिय है तो यह एक और कनेक्शन बनाना नहीं चाहिए।

minIdle="3" 

इस सेटिंग के साथ, डीबीसीपी हर समय 3 कनेक्शन बनाए रखेगा।

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

testWhileIdle="true", 
timeBetweenEvictionRunsMillis="60000"