आपका कोड अनिवार्य रूप से सही है। एक डेड लॉक होने पर उठाया गया अपवाद एक 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()
. को कॉल करेंगे जितनी जल्दी हो सके स्मृति जारी करने के लिए।
मैं आपको दृढ़ता से सलाह देता हूं कि इस ट्यूटोरियल के दूसरे अध्याय का पालन करें। ("एसक्यूएल स्टेटमेंट्स को प्रोसेस करना")।