sql >> Database >  >> RDS >> Mysql

Buffert MySQL Connector/J rijen bij het streamen van een ResultSet?

Dat doet het, althans soms. Ik heb het gedrag van MySQL Connector/J versie 5.1.37 getest met Wireshark. Voor de tafel ...

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

... met testgegevens ...

 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)

... en de code ...

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

... onmiddellijk na de s.executeQuery(sql) – d.w.z. vóór rs.next() wordt zelfs genoemd - MySQL Connector/J had de eerste ~140 rijen uit de tabel gehaald.

In feite, bij het opvragen van alleen de tag kolom

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

MySQL Connector/J heeft onmiddellijk alle 1000 rijen opgehaald, zoals blijkt uit de Wireshark-lijst met netwerkframes:

Frame 19, dat de vraag naar de server stuurde, zag er als volgt uit:

De MySQL-server reageerde met frame 20, dat begon met ...

... en werd onmiddellijk gevolgd door frame 21, dat begon met ...

... enzovoort totdat de server frame 32 had verzonden, wat eindigde met

Aangezien het enige verschil de hoeveelheid informatie was die voor elke rij werd geretourneerd, kunnen we concluderen dat MySQL Connector/J een geschikte buffergrootte bepaalt op basis van de maximale lengte van elke geretourneerde rij en de hoeveelheid vrij geheugen die beschikbaar is.

MySQL Connector/J haalt in eerste instantie de eerste fetchSize . op groep rijen, dan als rs.next() beweegt, zal het uiteindelijk de volgende groep rijen ophalen. Dat geldt zelfs voor setFetchSize(1) wat overigens de manier is om echt krijg slechts één rij tegelijk.

(Merk op dat setFetchSize(n) voor n>0 vereist useCursorFetch=true in de verbindings-URL. Dat is blijkbaar niet vereist voor setFetchSize(Integer.MIN_VALUE) .)




  1. NLS_LOWER() Functie in Oracle

  2. Update MySQL vanuit CSV met JAVA

  3. MySQL COUNT() en nulls

  4. Forceer herladen/verversen wanneer u op de terug-knop drukt