JDBC में, setFetchSize(int)
JVM के भीतर प्रदर्शन और मेमोरी-प्रबंधन के लिए विधि बहुत महत्वपूर्ण है क्योंकि यह JVM से डेटाबेस में नेटवर्क कॉल की संख्या को नियंत्रित करती है और तदनुसार परिणामसेट प्रोसेसिंग के लिए उपयोग की जाने वाली RAM की मात्रा को नियंत्रित करती है।
स्वाभाविक रूप से यदि setFetchSize(10) को कॉल किया जा रहा है और ड्राइवर इसे अनदेखा कर रहा है, तो शायद केवल दो विकल्प हैं:
- एक अलग JDBC ड्राइवर आज़माएं जो फ़ेच-साइज़ संकेत का सम्मान करेगा।
- कनेक्शन पर ड्राइवर-विशिष्ट गुण देखें (कनेक्शन इंस्टेंस बनाते समय URL और/या प्रॉपर्टी मैप)।
RESULT-SET क्वेरी के जवाब में DB पर मार्शल की गई पंक्तियों की संख्या है। ROW-SET उन पंक्तियों का हिस्सा है जो JVM से DB तक प्रति कॉल RESULT-SET से प्राप्त की जाती हैं। इनमें से संख्या प्रसंस्करण के लिए आवश्यक कॉल और परिणामी RAM फ़ेच-साइज़ सेटिंग पर निर्भर है।
इसलिए यदि RESULT-SET में 100 पंक्तियाँ हैं और फ़ेच-साइज़ 10 है, तो किसी भी समय लगभग 10*{row-content-size} RAM का उपयोग करके, सभी डेटा को पुनः प्राप्त करने के लिए 10 नेटवर्क कॉल होंगे।
डिफ़ॉल्ट फ़ेच-साइज़ 10 है, जो काफी छोटा है। पोस्ट किए गए मामले में, ऐसा प्रतीत होगा कि ड्राइवर फ़ेच-साइज़ सेटिंग को अनदेखा कर रहा है, एक कॉल में सभी डेटा पुनर्प्राप्त कर रहा है (बड़ी RAM आवश्यकता, इष्टतम न्यूनतम नेटवर्क कॉल)।पी>
ResultSet.next()
के नीचे क्या होता है? यह है कि यह वास्तव में परिणाम-सेट से एक समय में एक पंक्ति नहीं लाता है। यह (स्थानीय) ROW-SET से प्राप्त करता है और सर्वर से अगला ROW-SET (अदृश्य रूप से) प्राप्त करता है क्योंकि यह स्थानीय क्लाइंट पर समाप्त हो जाता है।
यह सब ड्राइवर पर निर्भर करता है क्योंकि सेटिंग सिर्फ एक 'संकेत' है लेकिन व्यवहार में मैंने पाया है कि यह कई ड्राइवरों और डेटाबेस के लिए काम करता है (Oracle, DB2 और MySQL के कई संस्करणों में सत्यापित)।