sql >> Databáze >  >> RDS >> Mysql

Vyrovnává se MySQL Connector/J řádky při streamování ResultSet?

Má, alespoň někdy. Testoval jsem chování MySQL Connector/J verze 5.1.37 pomocí Wireshark. Pro stůl ...

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

... s testovacími daty ...

 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)

... a kód ...

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

... bezprostředně za s.executeQuery(sql) – tj. před rs.next() se dokonce nazývá – MySQL Connector/J načetl prvních ~140 řádků z tabulky.

Ve skutečnosti při dotazu pouze na tag sloupec

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

MySQL Connector/J okamžitě načetl všech 1000 řádků, jak ukazuje seznam síťových rámců Wireshark:

Snímek 19, který odeslal dotaz na server, vypadal takto:

Server MySQL odpověděl rámcem 20, který začínal ...

... a hned po něm následoval snímek 21, který začínal ...

... a tak dále, dokud server neodeslal snímek 32, který skončil s

Protože jediným rozdílem bylo množství informací vrácených pro každý řádek, můžeme dojít k závěru, že MySQL Connector/J rozhoduje o vhodné velikosti vyrovnávací paměti na základě maximální délky každého vráceného řádku a množství dostupné volné paměti.

MySQL Connector/J zpočátku načte první fetchSize skupina řádků, pak jako rs.next() projde přes ně, nakonec načte další skupinu řádků. To platí i pro setFetchSize(1) což je mimochodem cesta k skutečně získat pouze jeden řádek najednou.

(Všimněte si, že setFetchSize(n) pro n>0 vyžaduje useCursorFetch=true v adrese URL připojení. To zřejmě není vyžadováno pro setFetchSize(Integer.MIN_VALUE) .)




  1. Změnit limit pro velikost řádku Mysql je příliš velká

  2. Jak se připojit k Amazon RDS přes SSL?

  3. Získání automatického doplňování jQuery pro práci se zdrojem PHP

  4. ORA-00900:neplatný příkaz SQL- při spuštění procedury v oracle 10g