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