यह करता है, कम से कम कभी-कभी। मैंने Wireshark का उपयोग करके MySQL Connector/J संस्करण 5.1.37 के व्यवहार का परीक्षण किया। टेबल के लिए...
CREATE TABLE lorem (
id INT AUTO_INCREMENT PRIMARY KEY,
tag VARCHAR(7),
text1 VARCHAR(255),
text2 VARCHAR(255)
)
... परीक्षण डेटा के साथ ...
id tag text1 text2
--- ------- --------------- ---------------
0 row_000 Lorem ipsum ... Lorem ipsum ...
1 row_001 Lorem ipsum ... Lorem ipsum ...
2 row_002 Lorem ipsum ... Lorem ipsum ...
...
999 row_999 Lorem ipsum ... Lorem ipsum ...
(where both `text1` and `text2` actually contain 255 characters in each row)
... और कोड ...
try (Statement s = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY)) {
s.setFetchSize(Integer.MIN_VALUE);
String sql = "SELECT * FROM lorem ORDER BY id";
try (ResultSet rs = s.executeQuery(sql)) {
... s.executeQuery(sql)
. के तुरंत बाद - यानी, rs.next()
. से पहले को भी कहा जाता है - MySQL Connector/J ने तालिका से पहली ~140 पंक्तियों को पुनः प्राप्त किया था।
वास्तव में, केवल tag
. को क्वेरी करते समय कॉलम
String sql = "SELECT tag FROM lorem ORDER BY id";
MySQL Connector/J ने नेटवर्क फ़्रेम की Wireshark सूची द्वारा दिखाए गए अनुसार सभी 1000 पंक्तियों को तुरंत पुनर्प्राप्त कर लिया:
फ़्रेम 19, जिसने सर्वर को क्वेरी भेजी, कुछ इस तरह दिख रहा था:
MySQL सर्वर ने फ्रेम 20 के साथ प्रतिसाद दिया, जिसकी शुरुआत ...
. से हुई थी... और उसके तुरंत बाद फ्रेम 21 आया, जो ...
. से शुरू हुआ... और इसी तरह जब तक सर्वर ने फ्रेम 32 नहीं भेजा था, जो समाप्त हो गया था
चूंकि अंतर केवल प्रत्येक पंक्ति के लिए दी जाने वाली जानकारी की मात्रा का था, इसलिए हम यह निष्कर्ष निकाल सकते हैं कि MySQL Connector/J प्रत्येक लौटाई गई पंक्ति की अधिकतम लंबाई और उपलब्ध मुफ्त मेमोरी की मात्रा के आधार पर एक उपयुक्त बफर आकार पर निर्णय लेता है।
MySQL Connector/J सबसे पहले fetchSize
. को पुनः प्राप्त करता है पंक्तियों का समूह, फिर rs.next()
. के रूप में उनके माध्यम से चलता है यह अंततः पंक्तियों के अगले समूह को पुनः प्राप्त करेगा। यह setFetchSize(1)
. के लिए भी सही है जो, संयोगवश, वास्तव में . का मार्ग है एक समय में केवल एक पंक्ति प्राप्त करें।
(ध्यान दें कि setFetchSize(n)
n>0 के लिए useCursorFetch=true
requires की आवश्यकता है कनेक्शन यूआरएल में। यह स्पष्ट रूप से setFetchSize(Integer.MIN_VALUE)
के लिए आवश्यक नहीं है ।)