2011-07-15 11 views
9

क्या प्रीपेडस्टेटमेंट्स और परिणामसेट्स का उपयोग हर बार उपयोग किए जाने पर "नया डेटाबेस उदाहरण" बनाता है? या, दूसरे शब्दों के साथ, यदि मैं एक प्रीपेयरस्टेटमेंट और एक परिणामसेट का उपयोग करता हूं, तो क्या मुझे प्रत्येक उपयोग के बाद या एक बार खत्म होने के बाद उन्हें बंद करना चाहिए?क्लोजिंग प्रीपेडस्टेट्स

उदाहरण:

while (...){ 
     p = connection.prepareStatement(...); 
     r = p.executeQuery(); 
     while (r.next()) { 
     .... 
     } 
} 
// We close at the end. Or there are any other p and r still opened...? 
p.close(); 
r.close(); 

या

while (...){ 
     p = connection.prepareStatement(...); 
     r = p.executeQuery(); 
     while (r.next()) { 
     .... 
     } 
     p.close(); 
     r.close(); 
} 

नोट: बेशक मैं कोशिश करते हैं और करीब ठीक से, यह सिर्फ एक उदाहरण है का प्रयोग करेंगे।

+0

आप उन्हें आखिरकार ब्लॉक में बंद कर देते हैं, ताकि आप यह सुनिश्चित कर सकें कि कोई रनटाइसेप्शन – chedine

उत्तर

5

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

कोशिश ब्लॉक के साथ

तो शामिल यह दिखाई देगा:

while (...){ 
     PreparedStatement p = connection.prepareStatement(...); 
     try { 
      ResultSet r = p.executeQuery(); 
      try { 
      while (r.next()) { 
       .... 
      } 
      } finally { 
      try { 
       r.close(); 
      } catch (SQLException e) { 
      // log this or something -- prevent these from masking original exception 
      } 
      } 
     } 
     finally { 
      try { 
      p.close(); 
      } catch (SQLException e) { 
      // log this or something -- prevent these from masking original exception 
      } 
     } 
} 

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

यह भी ध्यान रखें कि संसाधनों के साथ प्रयास करने से काम करना होगा, सिवाय इसके कि यदि आपके पास ऐसा कोई मामला है जहां डेटाबेस ऑपरेशन सफल होता है लेकिन अपवाद में करीबी परिणाम बुलाता है तो अपवाद फेंक दिया जाएगा।

मैं लोगों को अनुशंसा करता हूं कि लोग iffy या verbose jdbc को क्रैंकिंग के बजाय वसंत-जेडीबीसी लाइब्रेरी (जो आपके लिए सबकुछ बंद कर देता है) का उपयोग करें।

+0

कोई मदद नहीं है? :) http://stackoverflow.com/questions/35849664/sonar-close-this-preparedstatement –

5

पहला तरीका बेहतर है।

हालांकि, आपको पता होना चाहिए कि आप तैयार कथन का पुन: उपयोग कर सकते हैं (इसलिए नाम "तैयार") यदि आप जिस SQL ​​का उपयोग कर रहे हैं वह हर बार समान होता है। उदाहरण के लिए:

//Note: try/catch/finally blocks removed for brevity 
p = connection.prepareStatement(...); 
while (...){ 
    r = p.executeQuery(); 
    while (r.next()) { 
     .... 
    } 
    r.close(); 
} 
p.close(); 
+1

+1 तैयार कथन का पुन: उपयोग करने के लिए +1 –

+0

यहां कोई मदद? :) http://stackoverflow.com/questions/35849664/sonar-close-this-preparedstatement –

1

भले ही आप, स्प्रिंग, या अपाचे DbUtils, या इसी तरह का उपयोग पहचान वहाँ बॉयलरप्लेट का एक बहुत है कि यहाँ है कि आप इतना है कि आपकी क्वेरी दिनचर्या से बाहर कारक रखना चाहता हूँ नहीं करना चाहते हैं आप इसे जितनी बार संभव हो उतनी बार दोहराना होगा।

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