2012-12-24 60 views
18

मुझे पता है कि जावा में सुरक्षित पैटर्न अंततः ब्लॉक में अपने परिणामसेट, स्टेटमेंट और कनेक्शन को बंद करना है।कनेक्शन बंद करने से स्वचालित रूप से बंद स्टेटमेंट और परिणामसेट बंद हो जाता है?

यदि आप कनेक्शन बंद करते हैं और फिर स्टेटमेंट बंद करने का प्रयास करते हैं (अपवाद फेंक नहीं देता है)। लेकिन अगर आप कथन से किसी भी विधि को कॉल करने का प्रयास करते हैं तो अपवाद फेंक दिया जाता है।

मैं सोच रहा था कि बंद कनेक्शन कनेक्शन से उत्पन्न सभी कथन ऑब्जेक्ट्स को स्वचालित रूप से बंद कर देता है?

अद्यतन:
मैं DatabaseProductVersion उपयोग कर रहा हूँ: Oracle डाटाबेस 11g रिलीज 11.1.0.0.0
drivername: Oracle JDBC ड्राइवर
DriverVersion: 10.2.0.4.0

+2

http://stackoverflow.com/questions/4507440/must-jdbc-resultsets-and-statements-be-closed-separately-although-the-connection –

उत्तर

14

हां यह करता है, कनेक्शन.क्लोस एपीआई कहता है, "स्वचालित रूप से रिलीज़ होने के इंतजार के बजाय इस कनेक्शन ऑब्जेक्ट के डेटाबेस और जेडीबीसी संसाधनों को तुरंत जारी करता है"। समस्या यह है कि अनुप्रयोग आमतौर पर डेटाबेस कनेक्शन पूल का उपयोग करते हैं और ये कनेक्शन कनेक्शन पर पूल में कनेक्शन वापस कर सकते हैं।

किसी भी मामले में, परिणामस्वरूप परिणाम और स्टेटमेंट को हमेशा बंद करने और कनेक्शन.क्लोज़ पर भरोसा न करने के लिए यह एक अच्छा अभ्यास है।

इसके अलावा, सीधे जेडीबीसी के साथ काम करना सबसे अच्छा विचार नहीं है। आप इसके बजाय स्प्रिंग जेडीबीसी का उपयोग कर सकते हैं और संसाधनों की समस्या को जारी करने के बारे में भूल सकते हैं।

+2

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

+1

दाएं। मैंने अपाचे के बेसिकडेटा स्रोत के साथ इसका परीक्षण करने का निर्णय लिया: मैंने कॉन खोला, बनाया stmt, बंद कॉन और रन क्वेरी। GQ SQLException "[email protected]" बंद है। " –

+0

" जेडीबीसी के साथ सीधे काम करना सबसे अच्छा विचार नहीं है "। क्यों नहीं? वसंत कुछ मामलों में उपयोगी हो सकता है, लेकिन दूसरों में केवल अनावश्यक ओवरहेड बनाता है। –

2

विवरण अंततः प्रत्येक JDBC करने के लिए नीचे कर रहे हैं चालक कार्यान्वयन; हालांकि, डेटाबेस से कनेक्शन बंद होने के बाद, इससे संबंधित सब कुछ डीबी पक्ष पर निपटाया जाता है, इसलिए क्लाइंट पक्ष कुछ भी नहीं कर सकता है लेकिन इन संसाधनों का प्रतिनिधित्व करने वाली वस्तुओं को स्वतः बंद कर देता है।

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