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

Làm thế nào để đọc tất cả các hàng từ bảng lớn?

Phiên bản ngắn gọn là, gọi stmt.setFetchSize(50);conn.setAutoCommit(false); để tránh đọc toàn bộ ResultSet vào bộ nhớ.

Đây là những gì tài liệu nói:

Nhận kết quả dựa trên con trỏ

Theo mặc định, trình điều khiển thu thập tất cả các kết quả cho truy vấn cùng một lúc. Điều này có thể gây bất tiện cho các tập dữ liệu lớn, do đó, trình điều khiển JDBC cung cấp một phương tiện dựa trên ResultSet trên con trỏ cơ sở dữ liệu và chỉ tìm nạp một số lượng nhỏ hàng.

Một số lượng nhỏ hàng được lưu trong bộ nhớ đệm ở phía máy khách của kết nối và khi hết khối hàng tiếp theo sẽ được truy xuất bằng cách định vị con trỏ.

Lưu ý:

  • Bộ Kết quả dựa trên con trỏ không thể được sử dụng trong mọi tình huống. Có một số hạn chế sẽ khiến trình điều khiển âm thầm quay lại tìm nạp toàn bộ Tập kết quả cùng một lúc.

  • Kết nối đến máy chủ phải sử dụng giao thức V3. Đây là cài đặt mặc định cho (và chỉ được hỗ trợ bởi) máy chủ phiên bản 4.7 trở lên.-

  • Kết nối không được ở chế độ tự động gửi. Chương trình phụ trợ sẽ đóng con trỏ khi kết thúc các giao dịch, vì vậy trong mod autocommit, phần phụ trợ sẽ đóng con trỏ trước khi bất kỳ thứ gì có thể được tìm nạp từ nó. -

  • Tuyên bố phải được tạo với loại ResultSet là ResultSet.TYPE_FORWARD_ONLY. Đây là mặc định, vì vậy không cần viết lại mã nào để tận dụng lợi thế này, nhưng nó cũng có nghĩa là bạn không thể cuộn ngược lại hoặc nhảy xung quanh ResultSet.-

  • Truy vấn đã cho phải là một câu lệnh duy nhất, không phải nhiều câu lệnh được xâu chuỗi với nhau bằng dấu chấm phẩy.

Ví dụ 5.2. Đặt kích thước tìm nạp để bật và tắt con trỏ.

Thay đổi mã sang chế độ con trỏ đơn giản như đặt kích thước tìm nạp của Câu lệnh thành kích thước thích hợp. Đặt kích thước tìm nạp trở lại 0 sẽ khiến tất cả các hàng được lưu vào bộ nhớ đệm (hành vi mặc định).

// make sure autocommit is off
conn.setAutoCommit(false);
Statement st = conn.createStatement();

// Turn use of the cursor on.
st.setFetchSize(50);
ResultSet rs = st.executeQuery("SELECT * FROM mytable");
while (rs.next()) {
   System.out.print("a row was returned.");
}
rs.close();

// Turn the cursor off.
st.setFetchSize(0);
rs = st.executeQuery("SELECT * FROM mytable");
while (rs.next()) {
   System.out.print("many rows were returned.");
}
rs.close();

// Close the statement.
st.close();


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chuyển các tham số IN WHERE cho Dạng xem PostgreSQL?

  2. Sẽ tốt hơn nếu sử dụng nhiều cơ sở dữ liệu với một lược đồ, hay một cơ sở dữ liệu với nhiều lược đồ?

  3. Postgresql json like truy vấn

  4. Triển khai cụm đa đám mây PostgreSQL

  5. Không thể chỉ sử dụng tên bảng PostgreSQL (quan hệ không tồn tại)