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




