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