sql >> Database teknologi >  >> RDS >> Mysql

Buffer MySQL Connector/J rækker, når der streames et resultatsæt?

Det gør det i hvert fald nogle gange. Jeg testede adfærden for MySQL Connector/J version 5.1.37 ved hjælp af Wireshark. Til bordet ...

CREATE TABLE lorem (
    id INT AUTO_INCREMENT PRIMARY KEY,
    tag VARCHAR(7),
    text1 VARCHAR(255),
    text2 VARCHAR(255)
    )
 

... med testdata ...

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)

... og koden ...

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)) {
 

... umiddelbart efter s.executeQuery(sql) – dvs. før rs.next() kaldes endda – MySQL Connector/J havde hentet de første ~140 rækker fra tabellen.

Faktisk, når du kun forespørger tag kolonne

    String sql = "SELECT tag FROM lorem ORDER BY id";
 

MySQL Connector/J hentede straks alle 1000 rækker som vist på Wireshark-listen over netværksrammer:

Frame 19, som sendte forespørgslen til serveren, så således ud:

MySQL-serveren svarede med frame 20, som startede med ...

... og blev umiddelbart efterfulgt af ramme 21, som begyndte med ...

... og så videre indtil serveren havde sendt frame 32, som endte med

Da den eneste forskel var mængden af ​​information, der blev returneret for hver række, kan vi konkludere, at MySQL Connector/J beslutter sig for en passende bufferstørrelse baseret på den maksimale længde af hver returnerede række og mængden af ​​ledig hukommelse.

MySQL Connector/J henter i første omgang den første fetchSize gruppe af rækker, derefter som rs.next() bevæger sig gennem dem, vil den til sidst hente den næste gruppe rækker. Det gælder selv for setFetchSize(1) hvilket i øvrigt er vejen til virkelig få kun én række ad gangen.

(Bemærk at setFetchSize(n) for n>0 kræver useCursorFetch=true i forbindelsens URL. Det er tilsyneladende ikke påkrævet for setFetchSize(Integer.MIN_VALUE) .)




  1. mysql dubletter med LOAD DATA INFILE

  2. Databaseskema for ACL

  3. MySQL ATAN() Funktion – Returner buetangensen for en værdi (eller værdier)

  4. Hvordan opretter jeg forbindelse til en MySQL-database i Python?