2013-08-01 8 views
8

कई बार मैंने इस बयान से मुलाकात की कि एप्लिकेशन को हमेशा खोले गए सभी संसाधनों को स्पष्ट रूप से बंद करना चाहिए।संसाधनों को बंद करना हमेशा महत्वपूर्ण है?

प्रोग्रामिंग के लिए मेरा दृष्टिकोण अपेक्षाकृत व्यावहारिक है और मैं किसी भी ऐसे सम्मेलन का अंधाधुंध पालन करना पसंद नहीं करता जिसे मैं स्पष्ट रूप से लाभ नहीं देखता। इसलिए मेरा सवाल है।

की कि मान लेते हैं:

  1. मैं एक छोटे से आवेदन
  2. यह कुछ ही संसाधनों (जैसे फाइल, डेटाबेस कनेक्शन, दूरस्थ धाराओं) को खोलता है और यह संसाधित करता है
  3. में कुछ मिनट के लिए और फिर से काम करता है यह बाहर निकालता है
  4. मान लें कि यह जावा में है (यदि भाषा प्रासंगिक है)

मैं वास्तव में सीएल के बारे में देखभाल करने के लिए है चलो मैंने खोले गए सभी संसाधनों का पालन किया? मुझे लगता है कि खोले गए सभी संसाधन बंद/रिलीज़ किए जाएंगे जब एप्लिकेशन/आभासी मशीन निकलती है। क्या मैं सही हू?

यदि यह सच है, तो ऐसे छोटे, छोटे कामकाजी आवेदनों में बंद संसाधनों की देखभाल करने के लिए कोई ठोस कारण हैं?

अद्यतन:

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

प्रश्न का मुद्दा यह है कि क्या व्यावहारिक परिणाम हैं ऐसा नहीं कर रहा

+5

मुझे आपके लिए एक प्रश्न का उत्तर दें: आपको ** ** संसाधनों को बंद करने की परवाह क्यों नहीं करनी चाहिए? –

+1

"अनुमान लगाएं कि मेरे द्वारा खोले गए सभी संसाधन बंद/जारी किए जाएंगे जब एप्लिकेशन/वर्चुअल मशीन निकलती है।" -> मेरा अनुमान है कि यह सच नहीं है। यदि आप बंद नहीं करते हैं और वीएम निकलता है, तो ओएस उन धाराओं/सॉकेट को बंद करने के लिए जिम्मेदार हो सकता है। – kosa

+3

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

उत्तर

9

मुझे लगता है कि खोले गए सभी संसाधन बंद/जारी किए जाएंगे जब एप्लिकेशन/वर्चुअल मशीन निकल जाएगी।

संसाधन के साथ क्या होता है जो नियमित रूप से जारी नहीं किया गया था, आपके नियंत्रण से बाहर है। यह कोई नुकसान नहीं हो सकता है, या यह कुछ कर सकता है। यह भी अत्यधिक मंच-निर्भर है, इसलिए केवल एक पर परीक्षण करने में मदद नहीं मिलेगी।

मुझे इन संसाधनों को ऐसे छोटे, छोटे कामकाजी आवेदन में बंद करने की परवाह क्यों करनी चाहिए?

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

+1

संसाधन बंद करने के लिए बहुत अभ्यास की आवश्यकता है क्योंकि यह वास्तव में मुश्किल है (http://illegalargumentexception.blogspot.de/2008/10/java-how-not-to-make-mess-of-stream.html) – zapl

+0

@ महान लिंक के लिए zapl धन्यवाद! –

2

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

हमेशा जो भी संसाधन आप खोलते हैं उसे साफ़ करें!

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

+1

"जैसा कि यह जीवन के हर दूसरे क्षेत्र में है, अपने आप को साफ करने के लिए नहीं है", ठीक है! –

+2

धन्यवाद, आपने कुछ अच्छे अंक बनाए हैं। यह वास्तव में नहीं है कि मैं बहुत आलसी हूँ। मैं अपने कोड में करीबी संसाधन करता हूं। यह सिर्फ इतना है कि मुझे सिद्धांत पसंद नहीं है और चीजें कर रही हैं "क्योंकि हर कोई ऐसा करता है"। यही कारण है कि मैंने जानबूझकर इस तरह के विवादास्पद सवाल तैयार किए। और यह केवल आपके द्वारा वर्णित 5 सेकंड नहीं है कि मैं नापसंद लेकिन वर्बोज़ और बदसूरत कोड जावा में आवश्यक है। हमें निश्चित रूप से जावा 7 पर स्विच करने की आवश्यकता है जो संसाधनों के साथ प्रयास शुरू किया गया है। –

+0

मैंने अभी तक जावा 7 में नए "संसाधनों के साथ प्रयास करें" सुविधा के साथ नहीं खेला है, लेकिन वहां मैं आपके साथ सहमत हूं :) – StormeHawke

5

आप संसाधनों बंद नहीं करते हैं, तो यह है कि मई आवेदन सर्वर की ओर जाता है अक्सर पुन: प्रारंभ किया जा रहा ऑपरेटिंग सिस्टम occurs.because संसाधन थकावट और सर्वर अनुप्रयोगों आम तौर पर संसाधनों

के लिए एक ऊपरी बाध्य सीमा होती है जब docs

के अनुसार

सामान्य जावा एप्लिकेशन फ़ाइलों, धाराओं, सॉकेट और डेटाबेस कनेक्शन जैसे कई प्रकार के संसाधनों का उपयोग करता है। बहुत से संसाधन को बहुत सावधानी से संभाला जाना चाहिए, क्योंकि वे वें के लिए सिस्टम संसाधन प्राप्त करते हैं eir संचालन। इस प्रकार, आपको यह सुनिश्चित करने की आवश्यकता है कि त्रुटियों के मामले में भी वे मुक्त हो जाएं।

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

try-with-resources वक्तव्य प्रोग्रामर जो करीब बयानों से नफरत करता है के लिए जावा 7 में पेश किया।

+1

+1 'प्रयास-संसाधनों' के बारे में अच्छी युक्ति। जावा 5 के अंधेरे युग में फंस गया, मैं अपने अस्तित्व से अनजान था। – splungebob

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