2010-02-19 13 views
11

मेरे पास जावा में एक जेडीबीसी MySQL कनेक्शन है। मेरा प्रोग्राम क्वेरी के सरल निष्पादन के लिए ठीक काम करता है।रन टाइम पर जेडीबीसी प्रोग्राम में MySQLNonTransientConnectionException

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: 
Connection.close() has already been called. Invalid operation in 
this state. 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(
    Native Method) 
    com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: 
    No operations allowed after statement closed. 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(
    Native Method) 

मैं close() विधि कहीं भी इस्तेमाल नहीं किया है:

मैं निम्नलिखित MySQL अपवाद प्राप्त होता है मैं तो 10 से अधिक घंटे के लिए एक ही कार्यक्रम क्वेरी चलाने और निष्पादित। मैंने डेटाबेस कनेक्शन बनाया और इसे हमेशा के लिए खोला और हमेशा निष्पादित क्वेरी। ऐसा कोई स्थान नहीं है जहां मैंने स्पष्ट रूप से कनेक्शन के लिए टाइमआउट का उल्लेख किया हो। मैं समस्या की पहचान करने में असमर्थ हूं।

String driver = PropertyReader.getDriver(); 
String url = dbURLPath; 
Class.forName(driver); 
connectToServerDB = DriverManager.getConnection(url); 
connectToServerDB.setAutoCommit(false); 

क्या है कि अपवाद का कारण बनता है:

यहाँ कोड मैं डेटाबेस कनेक्शन के लिए उपयोग है?

उत्तर

5

आपको कॉन्फ़िगरेशन फ़ाइल में बदलाव करना होगा या अपने डेटाबेस की टाइमआउट अवधि बढ़ानी होगी। यदि डेटाबेस 8 घंटे से अधिक समय तक निष्क्रिय रहता है तो यह डिफ़ॉल्ट रूप से बंद होता है।

धन्यवाद

23

MySQL 8 घंटे के टाइमआउट के बाद कनेक्शन समाप्त कर देता है। आप MySQL में wait_timeout चर सेट करके टाइमआउट को संशोधित कर सकते हैं।

फिर भी, आमतौर पर इस तरह के लंबे समय तक कनेक्शन रखने के लिए एक अच्छा विचार नहीं है। पूलिंग एपीआई जैसे Apache DBCP का उपयोग करके एक कनेक्शन पूल स्थापित करना और ड्राइवर के बजाय सीधे पूल से कनेक्शन पुनर्प्राप्त करना एक बेहतर तरीका है। एक कनेक्शन पूल समयबद्ध समेत कुछ कारणों से मरने पर पूल किए गए कनेक्शन को फिर से स्थापित करने की भी देखभाल करेगा।

2

मुझे भी एक ही समस्या का सामना करना पड़ा। यह MySQL द्वारा कनेक्शन टाइमआउट की वजह से है और आम तौर पर यह MySQL में टाइमआउट को सीमित करने के लिए एक अच्छा अभ्यास नहीं है क्योंकि यह कई अन्य अनुप्रयोगों के लिए कार्य करता है। समय-समय पर डेटाबेस को पुन: कनेक्ट करना अच्छा होता है (यानी जब यह अपवाद होता है) या Apache DBCP जैसे कनेक्शन पूलिंग के लिए कुछ ओपन सोर्स लाइब्रेरी का उपयोग करने के लिए @slava सुझाया गया है। ओआरएम फ्रेमवर्क डिफ़ॉल्ट रूप से इसका ख्याल रखता है। चीयर्स !!

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