Nó có, ít nhất là đôi khi. Tôi đã kiểm tra hoạt động của MySQL Connector / J phiên bản 5.1.37 bằng cách sử dụng Wireshark. Đối với bảng ...
CREATE TABLE lorem (
id INT AUTO_INCREMENT PRIMARY KEY,
tag VARCHAR(7),
text1 VARCHAR(255),
text2 VARCHAR(255)
)
... với dữ liệu thử nghiệm ...
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)
... và mã ...
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)) {
... ngay sau s.executeQuery(sql)
- tức là trước rs.next()
thậm chí còn được gọi - MySQL Connector / J đã truy xuất ~ 140 hàng đầu tiên từ bảng.
Trên thực tế, khi chỉ truy vấn thẻ tag
cột
String sql = "SELECT tag FROM lorem ORDER BY id";
MySQL Connector / J ngay lập tức truy xuất tất cả 1000 hàng như được hiển thị trong danh sách khung mạng Wireshark:
Khung 19, đã gửi truy vấn đến máy chủ, trông như thế này:
Máy chủ MySQL phản hồi với khung 20, bắt đầu bằng ...
... và ngay sau đó là khung 21, bắt đầu bằng ...
... và cứ tiếp tục như vậy cho đến khi máy chủ gửi khung 32, kết thúc bằng
Vì sự khác biệt duy nhất là lượng thông tin được trả về cho mỗi hàng, chúng ta có thể kết luận rằng MySQL Connector / J quyết định kích thước bộ đệm thích hợp dựa trên độ dài tối đa của mỗi hàng được trả về và dung lượng bộ nhớ trống có sẵn.
MySQL Connector / J ban đầu truy xuất fetchSize
đầu tiên nhóm các hàng, sau đó là rs.next()
di chuyển qua chúng, cuối cùng nó sẽ truy xuất nhóm hàng tiếp theo. Điều đó đúng ngay cả với setFetchSize(1)
tình cờ là cách để thực sự chỉ nhận được một hàng tại một thời điểm.
(Lưu ý rằng setFetchSize(n)
cho n> 0 yêu cầu useCursorFetch=true
trong URL kết nối. Điều đó dường như không bắt buộc đối với setFetchSize(Integer.MIN_VALUE)
.)