sql >> Databasteknik >  >> RDS >> Mysql

Buffertar MySQL Connector/J rader när en ResultSet streamas?

Det gör det, åtminstone ibland. Jag testade beteendet hos MySQL Connector/J version 5.1.37 med Wireshark. Till 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)

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

... omedelbart efter s.executeQuery(sql) – dvs före rs.next() kallas till och med – MySQL Connector/J hade hämtat de första ~140 raderna från tabellen.

Faktum är att när man frågar bara tag kolumn

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

MySQL Connector/J hämtade omedelbart alla 1000 rader som visas av Wireshark-listan över nätverksramar:

Frame 19, som skickade frågan till servern, såg ut så här:

MySQL-servern svarade med ram 20, som började med ...

... och omedelbart följdes av bildruta 21, som började med ...

... och så vidare tills servern hade skickat frame 32, som slutade med

Eftersom den enda skillnaden var mängden information som returnerades för varje rad, kan vi dra slutsatsen att MySQL Connector/J bestämmer sig för en lämplig buffertstorlek baserat på den maximala längden på varje returnerad rad och mängden ledigt tillgängligt minne.

MySQL Connector/J hämtar initialt den första fetchSize grupp av rader, sedan som rs.next() går igenom dem kommer den så småningom att hämta nästa grupp av rader. Det är sant även för setFetchSize(1) vilket för övrigt är vägen till verkligen få bara en rad åt gången.

(Observera att setFetchSize(n) för n>0 kräver useCursorFetch=true i anslutningsadressen. Det krävs tydligen inte för setFetchSize(Integer.MIN_VALUE) .)




  1. Dölj dubbletter av resultat i MySQL-fråga

  2. Kan jag lagra bilder i MySQL

  3. Uppdatera fråga baserat på skick

  4. Ansluter till MySQL från Android med JDBC