Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

क्या परिणामसेट स्ट्रीमिंग करते समय MySQL कनेक्टर/जे बफर पंक्तियां करता है?

यह करता है, कम से कम कभी-कभी। मैंने 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) के लिए आवश्यक नहीं है ।)




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL रूट पासवर्ड बदलें और रीसेट करें

  2. पेजिंग के साथ बड़ी संख्या में डेटाबेस प्रविष्टियों को संसाधित करना समय के साथ धीमा हो जाता है

  3. विंडोज 10 पर कार्यक्षेत्र के साथ MySQL 8 कैसे स्थापित करें

  4. mysql जहां के खिलाफ मैच

  5. अजाक्स पीएचपी ड्रॉप डाउन सूची