2011-06-26 3 views
8

ठीक है, मुझे एहसास हुआ है कि मैंने वास्तव में समुदाय में योगदान किए बिना बहुत सारे प्रश्न पूछे हैं, लेकिन मुझे आपकी राय चाहिए। कहें कि मेरे पासएक कनेक्शन के साथ दो जावा प्रीपेडस्टेटमेंट्स को निष्पादित करना - शैली विकल्प

private void closeAll(ResultSet rs, PreparedStatement ps, Connection con) { 
    if (rs != null) 
     try { 
      rs.close(); 
     } catch (SQLException e) { 
     } 
    if (ps != null) 
     try { 
      ps.close(); 
     } catch (SQLException e) { 
     } 
    if (con != null) 
     try { 
      con.close(); 
     } catch (SQLException e) { 
     } 
} 

और मैं एक कनेक्शन का उपयोग करके अपने MySQL डेटाबेस पर कई संचालन करना चाहता था। यह बेहतर

Connection con = ...; 
PreparedStatement ps = null; 
ResultSet rs = null; 
try { 
    ps = con.prepareStatement(...); 
    rs = ps.executeQuery(); 
    if (rs.next()) ...; 
} catch (SQLException e) { 
    System.err.println("Error: " + e); 
} finally { 
    closeAll(rs, ps, null); 
} 
try { 
    ps = con.prepareStatement(...); 
    rs = ps.executeQuery(); 
    if (rs.next()) ...; 
} catch (SQLException e) { 
    System.err.println("Error: " + e); 
} finally { 
    closeAll(rs, ps, con); 
} 

या

Connection con = ...; 
PreparedStatement ps = null; 
ResultSet rs = null; 
try { 
    ps = con.prepareStatement(...); 
    rs = ps.executeQuery(); 
    if (rs.next()) ...; 
    rs.close(); 
    ps.close(); 

    ps = con.prepareStatement(...); 
    rs = ps.executeQuery(); 
    if (rs.next()) ...; 
} catch (SQLException e) { 
    System.err.println("Error: " + e); 
} finally { 
    closeAll(rs, ps, con); 
} 

मैं या तो, सुरक्षित साफ, अधिक संक्षिप्त, या और अधिक मजबूत मतलब करने के लिए बेहतर करने पर विचार लिखने के लिए है। मुझे यकीन नहीं है कि उत्तरार्द्ध हमेशा जो भी तैयार बयान बंद कर देगा और जब भी यह अपवाद का सामना करता है तो परिणाम सेट खुले होते हैं, जबकि मेरा मानना ​​है कि यह अधिक संक्षेप में दिखता है। लेकिन पूर्व अच्छा दिखता है क्योंकि यह अधिक सुसंगत है, फिर भी यह अधिक ओवरहेड डालता है क्योंकि यह अंत में ब्लॉक का अधिक प्रयास करता है।

मुझे एहसास है कि परियोजना सिक्का का जावा 7 का स्वचालित संसाधन प्रबंधन हिस्सा मुझे पूर्व में दुबला करने के लिए मजबूर करेगा क्योंकि हेडर में उपयोग किए जाने वाले संसाधन शरीर में पूरी तरह से अंतिम हैं। हालांकि, मेरे पास एआरएम को अनुकूलित करने के लिए मेरे कोड को संशोधित करने और बॉयलरप्लेट कोड को हटाने में सक्षम होने से पहले मुझे कुछ समय पहले चिंता करने की ज़रूरत है, इसलिए सवाल अभी भी खड़ा है: उपरोक्त दो शैलियों में से कौन सा बेहतर अभ्यास होगा? यदि वे दोनों अपेक्षित व्यवहार करते हैं, तो क्या बाद में मुझे एक उल्लेखनीय प्रदर्शन बढ़ावा मिलेगा जो "उलझन" शैली को क्षमा करेगा?

उत्तर

6

ऐसा लगता है कि यह व्यक्तिगत वरीयता का मामला है। मेरे समय में मैंने कोड लिखा है जो दोनों ब्लॉक जैसा दिखता है। प्रदर्शन के संबंध में मुझे नहीं लगता कि वहां विशेष रूप से ध्यान देने योग्य अंतर होगा, केवल प्रदर्शन परीक्षण ही बताएंगे।

यह एक मामला हो सकता है कि एक संस्करण वितरित करने वाला मिलीसेकंड या इतना अंतर दस मिनट के रूप में उतना ही महत्वपूर्ण नहीं है जितना कि कोई अन्य व्यक्ति आपके कोड को पढ़ने के छह महीने बाद पढ़ता है, यह पूछने में खर्च करेगा।

मेरी निजी वरीयता दूसरी होगी। आप कहते हैं कि आप डेटाबेस के लिए एक कनेक्शन खोल रहे हैं। कोड के पहले ब्लॉक के साथ यदि आपको अपवाद फेंक दिया जाता है, तो इसे संभाला जाएगा लेकिन फिर आप दूसरी कोशिश/पकड़ पर उतर जाएंगे और पुनः प्रयास करेंगे। आप शायद यह नहीं चाहते कि अगर पहला असफल रहा। दूसरे के साथ, एक अपवाद आपको कोड से बाहर आने का कारण बनता है और फिर अपना कनेक्शन बंद कर देता है।

मैंने मुख्य रूप से सी # में प्रोग्राम किया है। लगभग आठ साल पहले जब मैंने आखिरी बार जावा किया था। लेकिन मुझे लगता है कि सी # प्रोग्रामर बहुत सारे हैं और जिन्होंने इस पर विचार किया है। मेरे पास किसी भी दर पर है।

1

दूसरा तरीका जाने का तरीका है। पहले प्रयास-ब्लॉक में अपवाद होने पर पहला व्यक्ति कनेक्शन बंद करने में विफल हो सकता है। जब आप पकड़-ब्लॉक में बस stderr के लिए मुद्रण करते हैं तो नहीं, लेकिन आप ऐसा नहीं करेंगे। या दूसरे कथन को पहले की सफलता/विफलता के संबंध में निष्पादित किया जाना चाहिए?

4

यदि आप इसे देखते हैं, तो आप देखेंगे कि तर्क कुछ अलग है - पहला संस्करण दूसरी क्वेरी निष्पादित करेगा, भले ही पहली क्वेरी हैंडलिंग विफल हो जाए। दूसरा संस्करण केवल दूसरी क्वेरी को निष्पादित करने के लिए आगे बढ़ेगा, अगर पहली क्वेरी को संभालना + परिणाम सफल होंगे।

0

मुझे एहसास है कि यह पोस्ट पुराना है, लेकिन यदि आप Java7 वातावरण में भागने के लिए भाग्यशाली हैं- तो मैं try-with-resource का उपयोग करने का सुझाव दूंगा।

यह आपके लिए कनेक्शन बंद करने को संभालेगा- क्योंकि कक्षा के नए संस्करण Closable इंटरफ़ेस को लागू करते हैं।

public static void viewTable(Connection con) throws SQLException { 

String query = "select COF_NAME, SUP_ID, PRICE, SALES, TOTAL from COFFEES"; 

try (Statement stmt = con.createStatement()) { 
    ResultSet rs = stmt.executeQuery(query); 

    while (rs.next()) { 
     String coffeeName = rs.getString("COF_NAME"); 
     int supplierID = rs.getInt("SUP_ID"); 
     float price = rs.getFloat("PRICE"); 
     int sales = rs.getInt("SALES"); 
     int total = rs.getInt("TOTAL"); 

     System.out.println(coffeeName + ", " + supplierID + ", " + 
          price + ", " + sales + ", " + total); 
    } 
} catch (SQLException e) { 
    JDBCTutorialUtilities.printSQLException(e); 
} 
} 
+1

आपका उत्तर प्रश्न के लिए अप्रासंगिक है – MozenRath