2011-01-10 9 views
6

हम सभी knowthat हमें लूप के भीतर एक नया उदाहरण बनाने के बजाय जेडीबीसी PreparedStatement का पुन: उपयोग करना चाहिए।तरीकों के बीच एक तैयार स्थिति का पुन: उपयोग?

लेकिन विभिन्न विधि आमंत्रणों के बीच PreparedStatement पुन: उपयोग कैसे करें? क्या पुन: उपयोग- "नियम" अभी भी गिनता है?

क्या मुझे वास्तव में PreparedStatement के लिए फ़ील्ड का उपयोग करने पर विचार करना चाहिए या क्या मुझे प्रत्येक आमंत्रण (इसे स्थानीय रखना) में तैयार कथन को बंद और फिर से बनाना चाहिए? (बेशक इस तरह की कक्षा का एक उदाहरण Connection से जुड़ा होगा जो कुछ आर्किटेक्चर में नुकसान हो सकता है)

मुझे पता है कि आदर्श उत्तर "यह निर्भर करता है"।
लेकिन मैं कम अनुभवी डेवलपर्स के लिए सबसे अच्छा अभ्यास ढूंढ रहा हूं कि वे ज्यादातर मामलों में सही विकल्प करेंगे।

+3

निश्चित रूप से इसे कक्षा का क्षेत्र नहीं बनाते हैं। इसे विधिवत रखें। – BalusC

उत्तर

13
बेशक

इस तरह के एक वर्ग का एक उदाहरण एक कनेक्शन जो एक नुकसान

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

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

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

संक्षेप में, विधि के शुरू में एक PreparedStatement प्राप्त करने के लिए, यह बार-बार का उपयोग कर एक पाश के भीतर है, तो विधि के अंत में यह बंद करने के मानक अभ्यास, सबसे अच्छा अभ्यास है।

+0

मुझे नहीं पता कि यह एक बड़ा सौदा क्यों है। आपके पास प्रति कनेक्शन एक धागा है। प्रत्येक सेवा वर्ग (जिसमें आपकी सीआरयूडी विधियां होती हैं) तैयार किए गए स्तरों को ऊपर-सामने बनाती है और उन्हें सभी तरीकों से पुन: उपयोग करती है। कनेक्शन बंद होने पर तैयार किए गए स्टेटमेंट बंद हो जाते हैं। – Gili

0

हाँ, यह पुन: उपयोग किया जा सकता है, लेकिन मुझे लगता है कि यह केवल गिनती अगर एक ही Connection वस्तु किया जा रहा है विश्वास करते हैं और अगर आप एक डेटाबेस कनेक्शन पूल का उपयोग कर रहे हैं (एक वेब अनुप्रयोग के भीतर से उदाहरण के लिए,) तो Connection वस्तुओं संभावित हो जाएगा हर बार अलग।

मैं हमेशा इस कारण के लिए एक वेब अनुप्रयोग के भीतर प्रत्येक उपयोग करने से पहले PreparedStatement से तैयार करें।

यदि आप कनेक्शन पूल का उपयोग नहीं कर रहे हैं तो आप सुनहरे हैं!

0

मैं अंतर दिखाई नहीं देता: अगर मैं एक ही कनेक्शन के खिलाफ बार-बार एक ही बयान पर अमल, क्यों किसी भी तरह से PreparedStatement पुन: उपयोग नहीं? कई पद्धतियां ठीक उसी बयान पर अमल करते हैं, तो शायद उस वक्तव्य का अपना तरीका (भी या अपने ही वर्ग) में समाहित किया जाना चाहिए। इस तरह आपको के आसपास गुजरने की आवश्यकता नहीं होगी।

+1

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

6

कई डेटाबेस वर्कलोड सीपीयू बाध्य, नहीं आईओ बाध्य कर रहे हैं। यह है कि डेटाबेस अधिक समय बिताने के इस तरह के एसक्यूएल प्रश्नों को पार्स और उन्हें कैसे संभाल करने के लिए ('कार्य योजना लागू करके' कर रही है) पता लगाना के रूप में काम कर रही है, की तुलना में यह डिस्क पहुँचने के व्यतीत समाप्त होता है का मतलब है।यह 'रिपोर्टिंग' वर्कलोड की तुलना में 'लेनदेन' वर्कलोड के बारे में अधिक सत्य है, लेकिन दोनों मामलों में योजना तैयार करने में व्यतीत समय आपके अपेक्षा से अधिक हो सकता है।

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

कुछ JDBC चालकों और/या कनेक्शन पूल की पेशकश पारदर्शी 'तैयार बयान कैशिंग', ताकि आप इसे अपने आप को क्या करने की जरूरत नहीं है। इतने लंबे समय के रूप में आप अपने विशेष चुना पारदर्शी कैशिंग रणनीति के व्यवहार को समझने, यह चीजों का ट्रैक रखने के जाने के लिए ठीक है ... क्या तुम सच में बचना चाहते हैं डेटाबेस पर हिट है।

+0

बहुत सारे सचेत प्रश्न हैं जिन्हें डेटाबेस पर बहुत सारे आईओ की आवश्यकता होगी। विशेष रूप से, कुछ भी जो बड़े डेटासेट की गणना/एकत्रीकरण/... करता है। –

+0

@Jochaim सौएर: मैं अपने दाने दावे योग्यता प्राप्त की है :-) –

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