Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

जावा/जेडीबीसी में इनो डीबी डेडलॉक्स को सही तरीके से कैसे संभालें?

आपका कोड अनिवार्य रूप से सही है। एक डेड लॉक होने पर उठाया गया अपवाद एक SQLException है . अपवाद का getSQLState() विधि एक त्रुटि कोड देता है जो अतिरिक्त जानकारी वास्तविक त्रुटि के बारे में।

आपको प्रयासों के बीच कुछ समय प्रतीक्षा भी करनी चाहिए, ताकि आपके सर्वर को बहुत अधिक लोड न किया जा सके।

जैसा कि आपने चतुराई से अनुमान लगाया है, अधिकतम संख्या में प्रयास सेट करें, या आप एक अनंत लूप में समाप्त हो सकते हैं।

अंतिम कोड इस तरह दिख सकता है:

boolean oops;
int retries = 5;
Connection c = null;
Statement s = null;
ResultSet rs = null;    

do
{
    oops = false;
    c = null;
    s = null;
    rs = null;
    try
    {
        c = openConnection();
        s = c.createStatement();
        rs = s.executeQuery("SELECT stuff FROM mytable");
        fiddleWith(rs);
    }
    catch (SQLException sqlex)
    {
        oops = true;
        switch(sqlex.getErrorCode()())
        {
            case MysqlErrorNumbers.ER_LOCK_DEADLOCK:
                // deadlock or lock-wait time-out occured
                break;
            ...
        }
        Thread.sleep(1000); // short delay before retry
    }
    finally
    {
        if (rs != null) try {
            rs.close();
        } catch (SQLException e) {
            // some error handler here
        }

        if (s != null) try {
            s.close();
        } catch (SQLException e) {
            // some error handler here
        }

        if (c != null) try {
            c.close();
        } catch (SQLException e) {
            // some error handler here
        }

    }
}
while (oops == true && retries-- > 0);

जाहिर है उपरोक्त कोड उप इष्टतम है। आप कनेक्शन समय पर होने वाली त्रुटियों और निष्पादन के समय त्रुटियों में अंतर करना चाह सकते हैं। आप यह भी पता लगा सकते हैं कि कुछ त्रुटियों के बाद, इस बात की बहुत कम उम्मीद है कि एक और प्रयास काम करेगा (उदाहरण के लिए गलत क्रेडेंशियल या SQL सिंटैक्स त्रुटि)।

आपने बहुत सारे प्रश्न पूछे, लेकिन मैं उन सभी का उत्तर देने का प्रयास करूंगा:

हाँ, ऊपर देखें:SQLException वे हैं, getErrorCode() . द्वारा प्रदान की गई अधिक जानकारी के साथ या getSQLState()

एक SQLException java.sql . से सभी वर्गों के लगभग सभी तरीकों से फेंका जा सकता है पैकेज।

हाँ, ऊपर देखें।

स्पष्ट रूप से आपको एक PreparedStatement को दोबारा नहीं बनाना चाहिए दो प्रश्नों के बीच। executeQuery() . को कॉल करने से पहले आपको बस अपने पैरामीटर में नए मान सेट करने होंगे दोबारा। बेशक यदि आपको किसी अन्य क्वेरी को निष्पादित करने की आवश्यकता है, तो एक नया PreparedStatement आवश्यक है।

ए (नया) ResultSet ऑब्जेक्ट Statement.executeQuery() द्वारा लौटाया जाता है , जो क्वेरी के परिणाम का प्रतिनिधित्व करता है। आप स्वयं ऐसी वस्तु कभी नहीं बनाते। आदर्श रूप से आप ResultSet.close() . को कॉल करेंगे जितनी जल्दी हो सके स्मृति जारी करने के लिए।

मैं आपको दृढ़ता से सलाह देता हूं कि इस ट्यूटोरियल के दूसरे अध्याय का पालन करें। ("एसक्यूएल स्टेटमेंट्स को प्रोसेस करना")।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. OSX 10.7 शेर पर MySQL रत्न

  2. #1136 - कॉलम की संख्या पंक्ति 1 में मूल्य गणना से मेल नहीं खाती

  3. एसक्यूएल ड्रॉप टेबल सिंटेक्स - डीबीएमएस द्वारा सूचीबद्ध

  4. लुकअप टेबल कितने महत्वपूर्ण हैं?

  5. डेटाग्रिडव्यू को MySQL डेटा से भरें