2009-10-13 16 views
8

फिर से कनेक्ट मैं JDBC उपयोग कर रहा हूँ एक डेटाबेस सर्वर से कनेक्ट करने के लिए। कनेक्शन वायरलेस नेटवर्क पर है और कई बार डोडी हो सकता है। उस समय जब कनेक्शन खो जाता है तो मुझे एप्लिकेशन को बंद करने और पुनरारंभ करने की आवश्यकता होती है।JDBC कनेक्शन

किसी को भी कोड के कुछ उदाहरण हैं, जहां मैं आवरण किसी प्रकार का स्वचालित रूप से पुन: कनेक्ट करने लिख सकते हैं और पिछले क्वेरी को फिर से चलाएं सकता है? यह बहुत सारी परेशानी बचाएगा।

मैं बस यकीन नहीं है कि यह कैसे/लागू किया जा सकता चाहिए हूँ। शायद पहले से ही कुछ उपलब्ध है?

उत्तर

1

एक कनेक्शन पूल आप के लिए इस संभाल उनमें से कई एक कनेक्शन को मान्य कर सकते हैं,। तो DBPC है जिसमें testOnBorrow पैरामीटर है जो उपयोग किए जाने से पहले प्रत्येक कनेक्शन पर एक सैनिटी चेक को मजबूर करता है। इस पैरामीटर का डिफ़ॉल्ट मान true है, इसे किसी भी प्रभाव के लिए गैर-शून्य स्ट्रिंग पर सेट करने के लिए केवल validationQuery की आवश्यकता है। तो validationQuery सेट करें और वहां आप जाओ! documentation देखें।

1

चेक बाहर Oracle की यूनिवर्सल कनेक्शन पूल (यूसीपी) पुस्तकालयों। वे पूरी तरह से जेडीबीसी 4.0 अनुपालन कर रहे हैं और यह जांचने के लिए isValid() कॉल लागू करें कि कोई कनेक्शन लाइव है या नहीं। यह चेक करना आसान है, अगर गलत रीकनेक्ट करें, तो अपनी क्वेरी चलाएं।

Oracle UCP Download Page

मैं जानता हूँ कि आप कनेक्शन पूल के बारे में पूछना नहीं था, तो आप शायद वैसे भी एक का उपयोग कर तो यह आप दुगना करने में मदद करेगा होना चाहिए।

+0

ओपी ** फ़ायरबर्ड ** का उपयोग कर रहा है, वह ओरेकल के ड्राइवर का उपयोग क्यों करेगा? फिर, मैं अपने कोड में कनेक्शन सत्यापन तर्क लागू नहीं करता, मैं इस पूल को लागू करने वाले पूल का उपयोग करता हूं (और इसके लिए जेडीबीसी 4.0 ड्राइवर का उपयोग करने की आवश्यकता नहीं है)। –

+0

फायरबर्ड मानते हैं (जो मैं स्वीकार करता हूं कि मुझे शून्य पता है) में एक जेडीबीसी चालक है तो वह अब भी इन कक्षाओं का उपयोग कर सकता है। ध्यान दें कि उन्हें यूनिवर्सल कनेक्शन पूल कहा जाता है - यह ओरेकल का सी 3 पी 0 या प्रॉक्सूल का संस्करण है। वे किसी भी जेडीबीसी चालक के साथ काम करते हैं। और हाँ, यह पूल अपने आप पर सत्यापन तर्क करेगा। – Gandalf

+0

मैं "सार्वभौमिक" कनेक्शन पूल के बारे में सहमत हूं। हालांकि, "जेबीडीसी 4.0 अनुपालन" एक जेडीबीसी चालक (इस समय विशिष्ट ओरेकल विशिष्ट) को संदर्भित करता है, पूल नहीं। वह मेरा मुद्दा था। –

4

भले ही आप JDBC कनेक्शन पूल या तो प्रदान की आवेदन सर्वर या Apache Commons पूलिंग उपयोग करें, यह एक पुनः प्रयास तर्क कोड करने के लिए सार्थक है। आपके एप्लिकेशन सर्वर की कॉन्फ़िगरेशन के आधार पर, ऐप सर्वर सभी पूल किए गए कनेक्शन को शुद्ध करेगा और कनेक्शन का एक नया सेट फिर से बनाएगा। यहां एक नमूना है:

Connection conn = null; 
    Statement stmt = null; 
    ResultSet rs = null; 
    // 
    // How many times do you want to retry the transaction 
    // (or at least _getting_ a connection)? 
    // 
    int retryCount = 5; 
    boolean transactionCompleted = false; 
    do { 

    try { 
    conn = getConnection(); // assume getting this from a 
          // javax.sql.DataSource, or the 
          // java.sql.DriverManager 

    retryCount = 0; 
    stmt = conn.createStatement(); 
    String query = "Some sample SQL"; 
    rs = stmt.executeQuery(query); 
    while (rs.next()) { 
    } 
    rs.close(); 
    rs = null; 
    stmt.close(); 
    stmt = null; 

    conn.close(); 
    conn = null; 
    transactionCompleted = true; 
    } catch (SQLException sqlEx) { 
    // 
    // The two SQL states that are 'retry-able' 
    // for a communications error. 
    // 
    // Only retry if the error was due to a stale connection, 
    // communications problem 
    // 
    String sqlState = sqlEx.getSQLState(); 
    if ("Substitute with Your DB documented sqlstate number for stale connection".equals(sqlState)) { 
     retryCount--; 
    } else { 
     retryCount = 0; 
    } 
    } finally { 
    if (rs != null) { 
     try { 
      rs.close(); 
     } catch (SQLException sqlEx) { 
      // log this 
     } 
    } 
    if (stmt != null) { 
     try { 
      stmt.close(); 
     } catch (SQLException sqlEx) { 
      // log this 
     } 
    } 
    if (conn != null) { 
     try { 
      // 
      // If we got here, and conn is not null, the 
      // transaction should be rolled back, as not 
      // all work has been done 
      try { 
       conn.rollback(); 
      } finally { 

          conn.close(); 
        } 
       } catch (SQLException sqlEx) { 
        // 
        // If we got an exception here, something 
        // pretty serious is going on, so we better 
        // pass it up the stack, rather than just 
        // logging it. . . 
        throw sqlEx; 
       } 
      } 
     } 
    } while (!transactionCompleted && (retryCount > 0)); 
} 
+0

यदि आप क्वेरी चलाने के दौरान कनेक्शन खो देते हैं, तो आप शायद अगले प्रयास के दौरान इसे फिर से खो देंगे। यदि ऐसा होता है तो वास्तविक समस्या को ठीक करें। –

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