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

Chèn hàng loạt Hibernate hoạt động như thế nào?

Thuộc tính Hibernate hibernate.jdbc.batch_size là một cách để ngủ đông tối ưu hóa trạng thái chèn hoặc cập nhật của bạn, trong khi vòng lặp xả là làm cạn bộ nhớ.

Không có kích thước hàng loạt khi bạn cố gắng lưu một câu lệnh chèn thực thể hibernate fire 1, do đó, nếu bạn làm việc với một bộ sưu tập lớn, đối với mỗi câu lệnh save hibernate fire 1

Hãy tưởng tượng đoạn mã sau:

for(Entity e : entities){
session.save(e);
}

Ở đây hibernate sẽ kích hoạt 1 câu lệnh chèn cho mỗi thực thể trong bộ sưu tập của bạn. Nếu bạn có 100 phần tử trong bộ sưu tập của mình thì 100 câu lệnh chèn sẽ bị kích hoạt. Cách tiếp cận này không hiệu quả lắm vì 2 lý do chính:

  • 1) Bạn tăng bộ nhớ cache cấp 1 theo cấp số nhân và có thể bạn sẽ sớm hoàn thành với OutOfMemoryException .
  • 2) Bạn làm giảm hiệu suất do mạng vòng quanh mỗi câu lệnh.

hibernate.jdbc.batch_size và vòng lặp xả có 2 mục đích khác nhau nhưng bổ sung cho nhau.

Hibernate sử dụng cái đầu tiên để kiểm soát số lượng thực thể sẽ có trong hàng loạt. Dưới vỏ bọc Hibernate, sử dụng java.sql.Statement.addBatch(...)executeBatch() các phương pháp.

Vì vậy, hibernate.jdbc.batch_size cho hibernate biết nó phải gọi addBatch() bao nhiêu lần trước khi gọi executeBatch() .

Vì vậy, việc đặt thuộc tính này không ngăn bạn hết bộ nhớ.

Để chăm sóc bộ nhớ, bạn phải xả phiên của mình một cách thường xuyên và đây là mục đích của vòng lặp.

Khi bạn viết:

for(Entity e : entities){
if (i % 100 == 0 && i>0) {
                    session.flush();
                    session.clear();
                }
}

bạn đang yêu cầu hibernate xả và xóa phiên sau mỗi 100 thực thể (bạn giải phóng bộ nhớ).

Vậy bây giờ mối liên hệ giữa hai điều này là gì?

Để tối ưu, bạn phải xác định jdbc.batch_size của mình và thông số xả của bạn giống hệt nhau.

nếu bạn xác định thông số tuôn ra thấp hơn mà batch_size bạn chọn để chế độ ngủ đông sẽ tuôn ra phiên thường xuyên hơn, do đó nó sẽ tạo ra một loạt nhỏ cho đến khi chuyển đến btach sizewhich là không hiệu quả

khi cả hai cùng ở chế độ ngủ đông sẽ chỉ thực thi các lô có kích thước tối ưu ngoại trừ lô cuối cùng nếu kích thước bộ sưu tập không phải là bội số của batch_size của bạn.

Bạn có thể xem thông tin sau đăng để biết thêm chi tiết về điểm cuối cùng này



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kiểm tra xem ngày hiện tại có nằm giữa hai ngày không + truy vấn chọn mysql

  2. Làm thế nào để hoán đổi giá trị của hai hàng trong MySQL mà không vi phạm ràng buộc duy nhất?

  3. Cài đặt MySQL trên CentOS 7

  4. MySQL:Có thể 'lấp đầy' một SELECT với các giá trị mà không có bảng không?

  5. Làm cách nào để trả về kết quả đầu ra của bảng tổng hợp trong MySQL?