2012-03-03 4 views
6

अक्सर, नेटवर्क में कोड इस तरह पाया जा सकता है:जो तेजी से है? वक्तव्य या PreparedStatement

private static final String SQL = "SELECT * FROM table_name"; 
.... 

और इस SQL ​​क्वेरी के लिए PreparedStatement प्रयोग किया जाता है। क्यूं कर?
जैसा कि मुझे पता है, तैयार स्टेटमेंट एसक्यूएल स्टेटमेंट को प्रीकंपाइल करने के लिए समय व्यतीत करता है। यह पता चला है कि वक्तव्य तैयार किए गए स्तर से तेज है। या मैं गलत हूँ?

उत्तर

11

पर अधिक देखें, जब आप अलग-अलग डेटा के साथ कई बार एक ही कथन चलाने के लिए तैयार कथन बहुत तेज होते हैं। Thats क्योंकि SQL केवल एक बार क्वेरी को मान्य करेगा, जबकि यदि आप केवल एक कथन का उपयोग करेंगे तो यह प्रत्येक बार क्वेरी को मान्य करेगा।

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

आपकी क्वेरी के लिए, एक कथन बनाम तैयार कथन चलाने के बीच अंतर शायद नगण्य है।

संपादित करें: नीचे दी गई टिप्पणी के जवाब में, आपको यह देखने के लिए डीएओ कक्षा में बारीकी से देखना होगा कि यह क्या कर रहा है। उदाहरण के लिए, प्रत्येक बार जब विधि कहा जाता है तो यह तैयार कथन को फिर से बनाता है तो आप तैयार बयानों का उपयोग करने का कोई लाभ खो देंगे।

जो आप प्राप्त करना चाहते हैं, वह आपकी दृढ़ता परत का encapsulation है ताकि उनके MySQL या Postgres या जो कुछ भी आप उपयोग कर रहे हैं, के लिए कोई विशिष्ट कॉल न हो, और साथ ही साथ चीजों के प्रदर्शन और सुरक्षा लाभों का लाभ उठाएं तैयार बयान ऐसा करने के लिए आपको जावा की अपनी ऑब्जेक्ट्स जैसे प्रीपेडस्टेटमेंट पर निर्भर होना चाहिए।

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

हाइबरनेट को किसी भी XML विक्रेता के माध्यम से उपयोग किए जा रहे डेटाबेस विक्रेता का उपयोग करने के लिए कॉन्फ़िगर किया जा सकता है, और इस प्रकार यह आपके दृढ़ता परत के वास्तव में साफ encapsulation प्रदान करता है। हालांकि, यह सही पाने के लिए काफी जटिल उत्पाद है!

+0

मैं कुछ स्पष्टीकरण देना चाहता हूं। मेरे सरल वेब ऐप में मेरे पास डीएओ कक्षा है। इस कक्षा में मेरे पास विधि है (आईडी द्वारा कुछ जानकारी लें) जो तैयार स्टेटमेंट का उपयोग करती है। इस विधि को कई बार कॉल करते समय, कितनी बार तैयार किया गया था स्टेटमेंट इस SQL ​​क्वेरी को पूर्व-संकलित करेगा? – Ifozest

+0

मैंने इसके लिए अपना मुख्य उत्तर संपादित किया है - यह आपके प्रश्न का एक दिलचस्प हिस्सा है। – christophmccann

+1

अधिक जानकारी के लिए अभी संपादित करें देखें। विस्तृत उत्तर के लिए – christophmccann

4

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

+0

हाँ, आप स्पष्ट चीजें कहते हैं। लेकिन इस क्वेरी में हमें किसी पैरामीटर को सेट करने की आवश्यकता नहीं है, और उस पर आधारित - हमारे पास SQL ​​इंजेक्शन नहीं होगा। – Ifozest

+1

तो हाँ, जैसा कि अन्य ने कहा है कि यदि कोई पैरामीटर नहीं है और आप केवल एक बार निष्पादित करते हैं, तो यह तैयार किए गए स्टेटमेंट के बजाय वक्तव्य करने के लिए थोड़ा तेज़ हो सकता है, लेकिन मैं हमेशा सुसंगत रहूंगा और हमेशा तैयार रहूंगा। –

0

मेरे ज्ञान के अनुसार तैयार स्तर तब बहुत तेज है। यहां कुछ कारण क्यों तैयार किया गया है, तो कथन कृपया अधिक विस्तार के लिए पढ़ें।
जेडीबीसी एपीआई डेटाबेस के साथ कनेक्टिविटी की कार्यक्षमता प्रदान करता है। फिर हम कथन और तैयार करने के उपयोग के साथ क्वेरी निष्पादित करने का प्रयास करते हैं।
क्वेरी निष्पादित करने के लिए चार चरण हैं।

एसक्यूएल क्वेरी का विश्लेषण।
इस क्वेरी को संकलित करें।
डेटा अधिग्रहण पथ का अनुकूलन।
क्वेरी निष्पादित करें।

स्टेटमेंट इंटरफ़ेस उपयुक्त है जब हमें क्वेरी को कई बार निष्पादित करने की आवश्यकता नहीं होगी।

स्टेटमेंट इंटरफेस के नुकसान। हैकर आसानी से डेटा हैक करने के लिए कर सकते हैं। मान लीजिए कि हमारे पास एक प्रश्न है जिसमें उपयोगकर्ता नाम और पासवर्ड एक पैरामीटर है जो आप उचित मानदंड दे सकते हैं उपयोगकर्ता नाम='[email protected] 'और पासवर्ड =' abc123 'वास्तव में यह वर्तमान है लेकिन हैकर उपयोगकर्ता नाम =' abc @ example.com 'या' 1 '= 1 और पासवर्ड =' 'जिसका अर्थ है कि आप सफलतापूर्वक लॉग इन कर सकते हैं। इसलिए वक्तव्य में यह संभव हो रहा है।
और जब हम डेटाबेस से डेटा प्राप्त करते हैं तो एसक्यूएल हर बार मान्य होता है।

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

1) हम सुरक्षित रूप से सेटर विधि के साथ क्वेरी के पैरामीटर का मूल्य प्रदान कर सकते हैं। 2) यह एसक्यूएल इंजेक्शन को रोकता है क्योंकि यह स्वचालित रूप से विशेष वर्णों से बच निकलता है। 3) जब हम चार चरणों से ऊपर कथन का उपयोग करते हैं तो हर बार निष्पादित होते हैं, लेकिन जब हम प्रीपेयरस्टेटमेंट का उपयोग करते हैं तो केवल अंतिम चरण निष्पादित होते हैं, इसलिए यह तेज़ी से कथन होता है।