सबसे पहले, क्लाइंट और सर्वर द्वारा तैयार किए गए कथनों के बीच अंतर करना महत्वपूर्ण है।
ग्राहक के लिए तैयार विवरण
ग्राहक तैयार बयान "नकली" तैयार बयान हैं। इसका मतलब है कि SQL स्टेटमेंट स्ट्रिंग को क्लाइंट साइड पर टोकननाइज़ किया जाता है और निष्पादन के लिए सर्वर को स्टेटमेंट भेजने से पहले किसी भी प्लेसहोल्डर को शाब्दिक मानों से बदल दिया जाता है। प्रत्येक निष्पादन पर सर्वर को एक पूर्ण SQL कथन भेजा जाता है। यह कैसे काम करता है, इसकी जांच के लिए आप सामान्य लॉग का उपयोग कर सकते हैं। उदा.
निम्नलिखित कोड:
ps=conn.prepareStatement("select ?")
ps.setInt(1, 42)
ps.executeQuery()
ps.setInt(1, 43)
ps.executeQuery()
लॉग में दिखाएगा:
255 Query select 42
255 Query select 43
"क्वेरी" इंगित करता है कि, प्रोटोकॉल स्तर पर, एक COM_QUERY
कमांड को निम्नलिखित कथन स्ट्रिंग के साथ भेजा जाता है।
सर्वर तैयार विवरण
सर्वर तैयार बयान "सत्य" तैयार बयान हैं जिसका अर्थ है कि क्वेरी टेक्स्ट सर्वर को भेजा जाता है, पार्स किया जाता है, और प्लेसहोल्डर और परिणाम की जानकारी क्लाइंट को वापस कर दी जाती है। useServerPrepStmts=true
setting सेट करते समय आपको यही मिलता है . स्टेटमेंट स्ट्रिंग केवल एक बार सर्वर पर एक COM_STMT_PREPARE
के साथ भेजी जाती है कॉल (दस्तावेज यहां
) प्रत्येक निष्पादन एक COM_STMT_EXECUTE
. भेजकर किया जाता है प्लेसहोल्डर्स के स्थान पर तैयार किए गए स्टेटमेंट हैंडल और शाब्दिक मूल्यों के साथ।
क्लाइंट द्वारा तैयार किए गए उदाहरण के विपरीत, हम कोड के समान ब्लॉक का उपयोग कर सकते हैं (लेकिन इस बार सर्वर तैयार स्टेटमेंट सक्षम होने के साथ):
ps2=conn2.prepareStatement("select ?")
ps2.setInt(1, 42)
ps2.executeQuery()
ps2.setInt(1, 43)
ps2.executeQuery()
और लॉग दिखाएगा:
254 Prepare select ?
254 Execute select 42
254 Execute select 43
आप देख सकते हैं कि कथन निष्पादित होने से पहले तैयार किया गया है। लॉग हमें एक एहसान कर रहा है और निष्पादन के लिए पूरा विवरण दिखा रहा है, लेकिन वास्तव में, प्रत्येक निष्पादन के लिए क्लाइंट से सर्वर पर केवल प्लेसहोल्डर मान भेजे जाते हैं।
तैयार विवरणों को संचित करना
कई कनेक्शन पूल एक कनेक्शन के उपयोग के दौरान तैयार किए गए बयानों को कैश करेंगे, जिसका अर्थ है कि यदि आप conn.prepareStatement("select ?")
को कॉल करते हैं , यह वही PreparedStatement
. लौटाएगा एक ही कथन स्ट्रिंग के साथ लगातार कॉल पर उदाहरण। लेन-देन के बीच पूल में कनेक्शन वापस आने पर सर्वर पर एक ही स्ट्रिंग को बार-बार तैयार करने से बचने के लिए यह उपयोगी है।
MySQL JDBC विकल्प cachePrepStmts
इस तरह से तैयार बयानों को कैश करेगा (क्लाइंट और सर्वर दोनों तैयार बयान) और साथ ही एक बयान की "तैयारी" को कैश करेगा। MySQL में कुछ स्टेटमेंट ऐसे हैं जो सर्वर साइड पर तैयार नहीं किए जा सकते हैं। ड्राइवर सर्वर पर एक स्टेटमेंट तैयार करने की कोशिश करेगा यदि उसे लगता है कि यह संभव है और, यदि तैयारी विफल हो जाती है, तो क्लाइंट द्वारा तैयार किए गए स्टेटमेंट पर वापस आ जाता है। सर्वर पर चक्कर लगाने की आवश्यकता के कारण यह चेक महंगा है। विकल्प इस चेक के परिणाम को कैश भी करेगा।
आशा है कि यह मदद करता है।