Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

MySQL Connector / J có đệm các hàng khi phát trực tuyến ResultSet không?

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




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Toán tử so sánh MySQL, dấu cách

  2. MySQL:@variable so với biến. Có gì khác biệt?

  3. Sử dụng CPU cao của MySQL

  4. Tôi có thể dự đoán chỉ mục Zend Framework của mình sẽ lớn như thế nào không? (và một số câu hỏi nhanh:s)

  5. Các tập lệnh MySQL trong docker-entrypoint-initdb không được thực thi