2009-06-24 12 views
27

कुछ सवाल JDBC में बंद करने के लिए कनेक्शन, वक्तव्य, PreparedStatement और ResultSet:जब कोडिंग JDBC पर

  1. एक भी क्लाइंट अनुप्रयोग के लिए, हम एक कनेक्शन पूल की जरूरत है?
  2. यह एक अच्छा विचार शुरुआत में एक कनेक्शन बना सकते हैं और आवेदन बाहर निकलें जब तक पास इसके बिना यह जीवित रखने के लिए है? क्यूं कर?
  3. PreparedStatement, कनेक्शन के साथ जुड़ा हुआ है, तो मेरे कनेक्शन प्रत्येक प्रश्न के बाद बंद नहीं है, यही कारण है कि PreparedStatement जिंदा नहीं रख और अन्य तरीकों में यह पुन: उपयोग?
  4. अगर हम PreparedStatement प्रत्येक क्वेरी बनाने के लिए, डेटाबेस जानता है कि यह एक ही PreparedStaement है और पहली बार के बाद अनावश्यक कार्यों पर ध्यान न दें?
  5. तैयार की गई स्थिति एक बार नहीं बनाई गई है और कई बार बयान का पुन: उपयोग नहीं किया गया है? यदि हां, तो हर बार इसे बंद करने की आवश्यकता क्यों है?

मैं कॉल पता (बंद करने के लिए) संसाधन जारी करेंगे। लेकिन अगर हम जानते हैं कि हम इसे बाद में इस्तेमाल करने जा रहे हैं, तो इसे क्यों जारी करें और फिर बाद में इसका अनुरोध करें?

कैसे बहु क्लाइंट अनुप्रयोग के बारे में? हमें कनेक्शन पूल की आवश्यकता है और इसलिए हमें हर बार कनेक्शन, स्टेटमेंट और प्रीपेडस्टेटमेंट बनाने और बंद करने की आवश्यकता है?

धन्यवाद,

+0

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

उत्तर

12

व्यक्तिगत तौर पर मैं एक पूल का उपयोग करेंगे के रूप में यह आपके लिए संसाधन प्रबंधन के सभी का ध्यान रखना होगा। यदि आपकी कनेक्शन आवश्यकताएं बदलती हैं तो आप पूल कॉन्फ़िगरेशन को आसानी से संशोधित कर सकते हैं। एक पूल के साथ आप best-practice के अनुसार कनेक्शन खोल सकते हैं और तैयार कथन खोल सकते हैं और संसाधन प्रबंधन को पूल में छोड़ सकते हैं।

आमतौर पर, एक पूल का उपयोग करते समय:

  • एक कनेक्शन बंद करने वास्तव में सिर्फ पूल में वापस कर देंगे
  • एक बयान तैयार करने या तो कनेक्शन के बयान कैश से एक पहले से तैयार बयान को पुनः प्राप्त करेगा का कार्य, या यदि कोई उपलब्ध नहीं है, तो एक नया कथन बनाएं और इसे बाद में उपयोग के लिए कैश करें।
  • एक प्रीपेयरस्टेटमेंट बंद करने का कार्य वास्तव में इसे कनेक्शन के कथन कैश पर वापस कर देगा।

इसके अलावा - पूल कार्यान्वयन के आधार पर - यह आपको सूचित करने में सक्षम हो सकता है जब संसाधन लीक आपके कोड में इन प्रकार की समस्याओं की पहचान करना आसान बनाता है।

DBCP की तरह एक उदाहरण दिया गया के स्रोत पर एक नजर डालें - यह देखने के लिए वे कैसे काम काफी दिलचस्प है।

+0

अपने पूल पर भरोसा न करें: http: // stackoverflow। कॉम/प्रश्न/4507440/जरूरी-जेडीबीसी-परिणाम-और-स्टेटमेंट-बंद-अलग-अलग-हालांकि-कनेक्शन-कनेक्शन – tetsuo

+0

@teabot मैं प्रत्येक क्वेरी निष्पादन के बाद कनेक्शन सहित सभी ऑब्जेक्ट्स बंद करता हूं। क्या प्रत्येक कथन के बजाय प्रत्येक अनुरोध के लिए एक कनेक्शन खोलना और बंद करना बेहतर है? मेरा मतलब है, विवरण और परिणाम सेट्स प्रति उपयोग बंद हैं लेकिन कनेक्शन उन सभी के लिए एक है (अनुरोध की शुरुआत में खुलता है और आखिरी अंत में बंद हो जाता है क्वेरी निष्पादन) – AHHP

1

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

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

3. डेटाबेस और ड्राइवर के आधार पर, कनेक्शन में एक तैयार कथन कैश हो सकता है। यहां तक ​​कि यदि एक अलग कनेक्शन का उपयोग करते हैं, तो आरडीबीएमएस आम तौर पर उन पैरामीटर को कैश करता है जो पैरामीटर समेत समान होते हैं। इसलिए चयन करें * तालिका से मूल्य =? चूंकि एक तैयार कथन कनेक्शन में कैश किया जाएगा, लेकिन यदि आप पैरामीटर मान निर्दिष्ट करते हैं जैसे तालिका * से मूल्य = 'your_data' तो शायद यह सर्वर पक्ष को कैश नहीं किया जाएगा।

4. जैसा कि 3 में बताया गया है, आरडीबीएमएस कार्यान्वयन पर निर्भर करता है, एक बेंचमार्क करें।

5. अलग-अलग मानकों के साथ पुन: उपयोग किए जाने वाले बयान को फिर से तैयार करने और तैयार करने की आवश्यकता नहीं है। बस पैरामीटर फिर से सेट करें और निष्पादित करें।

एकाधिक ग्राहकों के लिए, डेटाबेस में हमेशा एक समवर्ती कनेक्शन सीमा होगी जो आमतौर पर कोई बड़ी संख्या नहीं होती है। यदि सभी ग्राहक वेबपैड से गुज़रते हैं तो डीबीसीपी जैसे पूल ठीक हैं। लेकिन जाहिर है कि प्रत्येक ग्राहक के लिए एक पूल बनाने के लिए अवांछनीय है, जिसमें कई कनेक्शन स्थायी रूप से खुलते हैं।

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