तो, आपका प्रश्न अंततः "कैसे java.sql.PreparedStatement
. पर निर्भर करता है PostgreSQL के साथ खेलता है। अंत में "यह सर्वर-तैयार योजनाओं के साथ कैसे खेलता है" पर उत्तर देखें।
यहां उत्तर दिया गया है:यह आपके द्वारा उपयोग किए जाने वाले JDBC ड्राइवर पर निर्भर करता है।
TL;DR :आधुनिक ड्राइवरों में सर्वर-तैयार स्टेटमेंट तब तक रहता है जब तक कनेक्शन खत्म नहीं हो जाता या जब तक स्टेटमेंट किसी अन्य द्वारा बेदखल नहीं हो जाता (नियमित एलआरयू बेदखली)।
नोट:PostgreSQL सर्वर तैयार किए गए स्टेटमेंट को डेटाबेस कनेक्शन में साझा नहीं कर सकता है, इस प्रकार सबसे अच्छा JDBC ड्राइवर यह कर सकता है कि प्रत्येक कनेक्शन में प्लान को कैश्ड रखा जाए।
नोट:JDBC विनिर्देश ?, ?
. के उपयोग को अनिवार्य करता है बाइंड प्लेसहोल्डर्स के लिए, जबकि सर्वर $1, $2
wants चाहता है इस प्रकार JDBC ड्राइवर तथाकथित पार्स किए गए SQL टेक्स्ट को भी कैश करते हैं।
दो प्रसिद्ध JDBC ड्राइवर हैं:pgjdbc और pgjdbc-ng
pgjdbc
https://github.com/pgjdbc/pgjdbc
चूंकि pgjdbc 9.4-1202
यह PreparedStatement
. का उपयोग करते समय सर्वर-साइड योजनाओं को स्वचालित रूप से कैश करता है .नोट:स्टेटमेंट कैश्ड होते हैं, भले ही आप close()
PreparedStatement
सर्वर-साइड तैयारी करने के लिए, आपको क्वेरी को 5 बार निष्पादित करने की आवश्यकता है (जिसे prepareThreshold
के माध्यम से कॉन्फ़िगर किया जा सकता है) )।
वर्तमान में, कैश प्रति कनेक्शन लागू किया गया है। डिफ़ॉल्ट रूप से pgjdbc कैश 256 (preparedStatementCacheQueries
) प्रश्न और preparedStatementCacheSizeMiB
. तक प्रश्नों का। यह एक रूढ़िवादी सेटिंग है, इसलिए आप इसे समायोजित करना चाह सकते हैं। देखें दस्तावेज़ीकरण
गुणों के विवरण के लिए। कैश में पार्स किए गए और सर्वर-तैयार दोनों कथन शामिल हैं।
जीथब मुद्दा:https://github.com/pgjdbc/pgjdbc/pull/319
pgjdbc-ng
https://github.com/impossibl/pgjdbc-ng
मैं pgjdbc-ng में नहीं हूं, हालांकि ऐसा लगता है कि यह दोनों पार्सिंग करता है (डिफ़ॉल्ट कैश आकार 250 query) और सर्वर-तैयारी (डिफ़ॉल्ट कैश आकार है 50ए> प्रश्न)। सर्वर-साइड तैयार स्टेटमेंट का समर्थन 24 फरवरी 2014 को आया, इसलिए यदि आप कुछ हद तक हाल के संस्करण का उपयोग करते हैं, तो आप स्टेटमेंट कैशिंग प्राप्त कर सकते हैं।
नोट:यदि आप गलती से बहुत लंबी क्वेरी का उपयोग करते हैं, तो आप OutOfMemory
. को हिट कर सकते हैं चूंकि pgjdbc-ng प्रतिधारित बाइट्स की संख्या के आधार पर प्रविष्टियों को बेदखल नहीं कर सकता है।
कैश प्रति-कनेक्शन है, इस प्रकार यह पारदर्शी रूप से उपयोग किया जाता है, भले ही आप बयान बंद कर दें।
मैं pgjdbc-ng प्रदर्शन के बारे में ज्यादा कुछ नहीं कह सकता, हालांकि पिछली बार जब मैंने jmh को इस पर फेंकने की कोशिश की तो यह यादृच्छिक अपवादों के साथ विफल रहा।
जीथब मुद्दा:https://github.com/impossibl/pgjdbc-ng/pull/ 69
सर्वर द्वारा तैयार योजनाएं
PostgreSQL में PREPARE
है और DEALLOCATE
EXEC
sending भेजते समय कथन को संदर्भित करने के लिए आदेश तार के ऊपर। यह दो चीजों का अनुकूलन करता है:
PREPARE
का उपयोग करते समय d स्टेटमेंट (दूसरे शब्दों में, सर्वर-तैयार एक), क्लाइंट को बार-बार क्वेरी टेक्स्ट भेजने की जरूरत नहीं है। यह केवल एक संक्षिप्त क्वेरी नाम और बाइंड चर के लिए मान भेजता है।- 9.2 से, डेटाबेस अभी भी किसी क्वेरी के पहले कुछ निष्पादन को फिर से योजना बनाने का प्रयास करता है। यह कोशिश करने के लिए ऐसा करता है कि क्या क्वेरी को कई योजनाओं की आवश्यकता है या यदि सामान्य योजना पर्याप्त है। अंततः (यदि क्वेरी में कोई पैरामीटर नहीं है), डेटाबेस सामान्य योजना पर स्विच कर सकते हैं ।
- 12 से, सभी सर्वर-तैयार स्टेटमेंट को जेनेरिक या कस्टम प्लान के साथ निष्पादित करने के लिए बाध्य करने के लिए एक सेटिंग है:plan_cache_mode
=
auto | force_custom_plan | force_generic_plan
दूसरे शब्दों में, PreparedStatement
JDBC पक्ष में क्वेरी पार्सिंग और डेटाबेस साइड पर क्वेरी प्लानिंग दोनों को अनुकूलित करता है।
अधिक जानकारी यहाँ:http://blog.endpoint .com/2014/04/custom-plans-prepared-statements-in.html
PL/pgSQL में तैयार किए गए स्टेटमेंट
दस्तावेज़ीकरण के अनुसार, PostgreSQL कैश पीएल/पीजीएसक्यूएल में प्रयुक्त प्रश्नों की योजना। यह कुछ निष्पादन के बाद होता है (3 या 5, मुझे सटीक सीमा याद नहीं है), इसलिए संग्रहीत प्रक्रिया बनाने के बाद यह थोड़ा धीमा हो सकता है, हालांकि फिर यह कैश्ड योजनाओं पर स्विच हो जाएगा (बशर्ते डेटाबेस जेनेरिक योजना का उपयोग करने के लिए सहमत हो) किसी विशेष क्वेरी के लिए)।
दूसरे शब्दों में "कैश्ड निष्पादन योजनाओं" को प्राप्त करने के लिए, आपको या तो अद्यतित JDBC ड्राइवर का उपयोग करने की आवश्यकता है, या आप अपने सभी प्रश्नों को संग्रहीत प्रक्रियाओं में लपेट सकते हैं। कॉल टू प्रोसेस प्रत्येक निष्पादन पर फिर से तैयार होगा, हालांकि कॉल ही है आमतौर पर प्रक्रिया की रचना करने वाले प्रश्नों की तुलना में बहुत छोटा होता है।