2012-11-14 11 views
5

हैलो सब मेरे पास एक बुनियादी तूफान एप्लिकेशन स्थापित है जहां इसे ट्वीट्स की स्ट्रीम प्राप्त होती है और उन्हें एक MySQL डेटाबेस में संग्रहीत करता है। एप्लिकेशन पहले ~ 23 घंटों के लिए बहुत अच्छा काम करता है या फिर यह निम्न त्रुटि दे रहा है:23 घंटे के बाद तूफान क्रैशिंग

SQL Exception 
SQL State: 08003 

यह कुछ बार मर जाता है। मैं जावा से डेटाबेस से कनेक्ट करने के लिए मानक जेबीडीसी कनेक्टर का उपयोग कर रहा हूं।

private String _db=""; 
private Connection conn = null; 
private PreparedStatement pst = null; 

public ArchiveBolt(String db){ 
    _db = db; 
} 

private void setupConnection() { 
    //Connect to the database 
    try { 
     Class.forName("com.mysql.jdbc.Driver"); 
     conn = DriverManager.getConnection("jdbc:mysql://localhost:8889/twitter_recording", "root", "root"); 
    } catch (Exception e){ 
     e.printStackTrace(); 
    } 
} 

public void execute(Tuple tuple, BasicOutputCollector collector) { 

    Status s = (Status) tuple.getValue(0); 

    //setup the connection on the first run through or if the connection got closed down 
    try { 
     setupConnection(); 
    } catch (Exception e) { 
     // TODO: handle exception 
     System.out.println(e.toString()); 
    } 


    try { 

     pst = conn.prepareStatement("INSERT INTO " + _db + " (tweet)" + 
            "VALUES (?);"); 

     pst.setString(1, s.toString()); 

     //execute the SQL 
     pst.executeUpdate(); 

    } catch (SQLException ex) { 
     // handle any errors 
     System.out.println("SQLException: " + ex.getMessage()); 
     System.out.println("SQLState: " + ex.getSQLState()); 
     System.out.println("VendorError: " + ex.getErrorCode()); 

     if(ex.getSQLState().equals("08003")){ 
      setupConnection(); 
     } 

    } finally { 
     try { 
      conn.close(); 
     } catch (SQLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 

के बाद यह स्पष्ट हो गया कि यह एक 08003 त्रुटि मैंने तय कर लिया है कि यदि यह त्रुटि फेंक दिया यह सेट पुन: प्रयास करना चाहिए की वजह से दुर्घटनाग्रस्त हो गया: इस प्रकार भंडारण और डीबी संबंध स्थापित करने के लिए कार्यों के लिए कोड हैं कनेक्शन के ऊपर, हालांकि यह मदद नहीं की थी। क्या कोई मुझे इस मुद्दे को हल करने के लिए सही दिशा में इंगित कर सकता है?

+0

[08003 \t कनेक्शन मौजूद नहीं है] (http://dev.mysql.com/doc/refman/5।0/en/connector-odbc-context-errorcodes.html) –

+0

क्या कनेक्शन हमेशा दिन के एक ही समय में टूट जाता है? यदि ऐसा है, तो शायद कुछ निर्धारित कार्यक्रम द्वारा कनेक्शन टूट गया है (उदा। डीबी दैनिक रिबूट हो जाता है)। –

+0

हाँ मुझे यह पता है। यही कारण है कि इस मामले में फिर से कनेक्शन सेटअप था कि यह इस त्रुटि में चलाता है। जैसा कि ऊपर दिखाया गया है (एसक्यूलेक्सप्शन पूर्व) { // किसी भी त्रुटि को System.out.println ("SQLException:" + ex.getMessage()) को संभाल लें; System.out.println ("SQLState:" + ex.getSQLState()); System.out.println ("विक्रेता त्रुटि:" + ex.getErrorCode()); अगर (ex.getSQLState() बराबर ("08003")) { सेटअप कनेक्शन(); } } ' –

उत्तर

3

After it became apparent that it was crashing because of a 08003 error I decided that if it threw that error it should retry the set up of the connection, however that didn't help either. Could anyone point me in the right direction for solving this issue?

वहाँ मूलतः हल किया जा करने की जरूरत है कि यहां दो समस्याएं हैं:

  • क्यों कनेक्शन पहली जगह में खो रहा है कर रहे हैं?
  • सफल होने का आपका प्रयास क्यों नहीं है?

पहली समस्या के लिए, आपको यह देखने के लिए MySQL लॉग पर एक नज़र डालना चाहिए कि वहां कोई संकेत है या नहीं। और, "राज्य 080003" अपवादों (दोहराए गए) से पहले तुरंत SQL अपवादों की जांच करें। उत्तरार्द्ध बस आपको बता रहा है कि कनेक्शन पहले मर गया है।

मेरा अनुमान है कि समस्या निम्न में से एक है:

  • MySQL सर्वर निष्क्रियता के कारण कनेक्शन का समय समाप्त हो गया है। यदि यह समस्या है तो आप MySQL कॉन्फ़िगरेशन में कनेक्शन टाइमआउट बदल सकते हैं।

  • आपका आवेदन धीरे-धीरे जेडीबीसी कनेक्शन लीक हो सकता है।

दूसरी समस्या के लिए, सामान्य दृष्टिकोण सही है, लेकिन अपने कोड विवरण से मेल नहीं खाता। वास्तव में, ऐसा लगता है कि यह हमेशा हर बार आपकी execute विधि कहलाता है, तो एक नया डेटाबेस कनेक्शन स्थापित करने का प्रयास कर रहा है। यह आपके अपवाद हैंडलर व्यर्थ में पुन: कनेक्शन कॉल प्रस्तुत करता है। (ओटीओएच, कोड दिखाता है कि कोई इसे काम करने की कोशिश करने के लिए "इसे मार रहा है" ... और यह अच्छी तरह से समस्या का हिस्सा हो सकता है।)

मैं जांचता हूं कि setupConnection को कहा जा रहा है जब इसे होने की आवश्यकता होती है, और किसी भी अपवाद की तलाश की जाती है जिसे फेंक दिया जा सकता है। इसके अतिरिक्त, आपको यह सुनिश्चित करना चाहिए कि आप स्पष्ट रूप से close() मृत कनेक्शन ऑब्जेक्ट ... और अपने कनेक्शन प्रबंधन पर पुनर्विचार/रिकोड करें ताकि यह रिसाव न हो।


रिकॉर्ड के लिए, वहाँ एक कनेक्शन URL पैरामीटर "autoReconnect" कहा जाता है कि सुदूर अतीत में खो कनेक्शन के साथ "सौदा" के लिए इस्तेमाल किया है। दुर्भाग्यवश, मूल कार्यान्वयन असुरक्षित था, इसलिए उन्होंने इसे प्रभावी रूप से अक्षम कर दिया; विवरण के लिए यह प्रश्न देखें: Why does autoReconnect=true not seem to work?

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