Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Apakah MySQL Connector/J buffer baris saat streaming ResultSet?

Memang, setidaknya kadang-kadang. Saya menguji perilaku MySQL Connector/J versi 5.1.37 menggunakan Wireshark. Untuk meja ...

CREATE TABLE lorem (
    id INT AUTO_INCREMENT PRIMARY KEY,
    tag VARCHAR(7),
    text1 VARCHAR(255),
    text2 VARCHAR(255)
    )

... dengan data uji ...

 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)

... dan kode ...

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

... segera setelah s.executeQuery(sql) – yaitu, sebelum rs.next() bahkan disebut – MySQL Connector/J telah mengambil ~140 baris pertama dari tabel.

Faktanya, saat menanyakan hanya tag kolom

    String sql = "SELECT tag FROM lorem ORDER BY id";

MySQL Connector/J segera mengambil 1000 baris seperti yang ditunjukkan oleh daftar frame jaringan Wireshark:

Frame 19, yang mengirimkan kueri ke server, tampak seperti ini:

Server MySQL merespons dengan frame 20, yang dimulai dengan ...

... dan segera diikuti oleh bingkai 21, yang dimulai dengan ...

... dan seterusnya sampai server mengirimkan frame 32, yang diakhiri dengan

Karena satu-satunya perbedaan adalah jumlah informasi yang dikembalikan untuk setiap baris, kita dapat menyimpulkan bahwa MySQL Connector/J memutuskan ukuran buffer yang sesuai berdasarkan panjang maksimum setiap baris yang dikembalikan dan jumlah memori bebas yang tersedia.

MySQL Connector/J awalnya mengambil fetchSize pertama sekelompok baris, lalu sebagai rs.next() bergerak melalui mereka pada akhirnya akan mengambil kelompok baris berikutnya. Itu benar bahkan untuk setFetchSize(1) yang, kebetulan, adalah cara untuk benar-benar dapatkan hanya satu baris dalam satu waktu.

(Perhatikan bahwa setFetchSize(n) untuk n>0 membutuhkan useCursorFetch=true di URL koneksi. Itu tampaknya tidak diperlukan untuk 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. Cara memilih kolom untuk tabel INNER JOIN tergantung pada nilai array yang digabungkan

  2. Membaca tanda-tanda seperti dari database MySql

  3. membuat nomor telepon dapat diklik untuk memanggil layar di ponsel?

  4. Pemicu Kebakaran MySQL untuk Sisipan dan Pembaruan

  5. Pola desain versi apa yang akan Anda rekomendasikan?