2015-11-30 22 views
5

Tôi có mối quan hệ một chiều cha/con. Khi tôi kiểm tra nhật ký tôi thấy rằng có một truy vấn chèn riêng biệt cho mỗi hàng trẻ em, tương đương với việc chúng ta hãy nói:Cách hiệu quả nhất để chèn nhiều hàng vào JPA

insert into childTable(col1, col2) values(val1, val2); 
insert into childTable(col1, col2) values(val3, val4); 

Nó sẽ không thể hiệu quả hơn để chèn tất cả các hàng trong một truy vấn duy nhất? Một cái gì đó dọc theo dòng:

insert into childTable(col1, col2) values(val1, val2), (val3, val4) 

Có cách nào để buộc JPA tạo ra nhiều dòng chèn thay vì chèn dòng đơn không?

Chỉnh sửa:Tôi hiện đang sử dụng chèn tầng nên tôi chèn phụ huynh và chèn cho trẻ em được tạo tự động. Tôi muốn tiếp tục sử dụng phương pháp đó thay vì chúng ta hãy nói bằng tay tạo một truy vấn SQL khổng lồ như tôi nghĩ rằng chèn tầng tạo ra mã sạch hơn.

Tôi đã xả phiên thường xuyên để kiểm soát kích thước bộ đệm L1 để hết bộ nhớ không phải là vấn đề.

Trả lời

2

Thực sự là không hiệu quả khi chèn tất cả các hàng trong một truy vấn.

Đầu tiên, một vài quan sát:

  1. Số lượng dữ liệu truyền từ client tới server là như nhau hoặc là một hoặc nhiều báo cáo chèn, trong đó "số lượng dữ liệu" có nghĩa là giá trị thực tế bạn lưu trữ.
  2. Hibernate hỗ trợ việc tạo đợt yêu cầu, do đó số lượng chuyến đi khứ hồi giữa máy khách và máy chủ có thể xấp xỉ bằng hoặc một hoặc nhiều câu lệnh chèn.

Dưới trang bìa, Hibernate đang sử dụng PreparedStatement cho mỗi truy vấn mà nó thực hiện thay cho bạn và các truy vấn này được lưu vào bộ nhớ cache và được sử dụng lại. Và MySQL lưu trữ các câu lệnh SQL "biên dịch". Nếu không nhận được thông tin chi tiết về mired, các công nghệ cơ bản được tối ưu hóa cao để chạy một số lượng truy vấn tương đối nhỏ nhiều lần.

Nếu bạn thực hiện chèn dưới dạng một câu lệnh, thì mỗi lần giá trị chèn là khác nhau, SQL mới phải được biên dịch và lưu vào bộ nhớ cache (có thể đẩy truy vấn khác từ bộ nhớ cache). Chi phí này tránh được khi bạn chỉ sử dụng cùng một SQL mỗi lần.

Vì nhiều lý do, bạn phải sử dụng các biến liên kết trong SQL của bạn và Hibernate sẽ tự động thực hiện điều đó cho bạn. Nếu bạn thực hiện một số truy vấn tùy chỉnh để kiểm tra phương thức chèn tất cả cùng một lúc, bạn chắc chắn cũng nên sử dụng các biến liên kết.

Một xem xét khác là cách bạn tạo số nhận dạng. Nếu nó là thông qua một cột nhận dạng trong cơ sở dữ liệu, sau đó Hibernate cần phải nhận lại ID cho mỗi cột, mà thường chỉ có thể khi một hàng được tạo ra. Vì lý do này, trình tạo mã định danh dựa trên trình tự được ưu tiên cho hiệu quả, với bộ nhớ đệm phía máy khách của các giá trị chuỗi.

Tôi vừa nhận thấy chỉnh sửa của bạn: Trải nghiệm của tôi đã khiến Hibernate thực hiện cập nhật "bổ sung" khi xử lý chèn dữ liệu cha-con. Tôi quản lý để có được "tinh khiết" chèn bằng cách thay đổi ánh xạ để có một "tham gia" bảng (như bạn sẽ thấy cho mối quan hệ nhiều-nhiều) mặc dù tôi chỉ có một mối quan hệ nhiều-một. Trong trường hợp của tôi, nó đã nhanh hơn đáng kể để chèn thêm đáng kể vào ba bảng so với chèn ít hơn cộng với cập nhật thành hai bảng.Nếu bạn quan tâm đến hiệu suất, bạn chắc chắn nên lên kế hoạch một thời gian để điều chỉnh cấu hình Hibernate.

+0

Điều này rất hữu ích. Tôi đã khá chắc chắn rằng chèn multiline không phải là tốt hơn đáng kể nhưng tôi figured tôi có thể nhận được một số cải tiến bằng cách đi qua B-cây cơ bản chỉ một lần. Tôi đang sử dụng các khóa chính tăng tự động nhưng sẽ xem xét sử dụng các chuỗi thay thế. – ventsyv

+1

@ventsyv & Rob Tôi biết tôi đang muộn để thảo luận nhưng kiểm tra [this] (http://stackoverflow.com/a/1793209/1398531) ra –

+0

@AbhishekBhatia Câu hỏi mà bạn liên kết đến đang nói về chèn nhiều giá trị so với chèn riêng biệt giá trị. Câu hỏi này là trong bối cảnh ngủ đông, hỗ trợ chèn hàng loạt. Lô sẽ chèn nhiều hàng trong một vòng chuyến đi đến máy chủ và sử dụng lại câu lệnh được phân tích cú pháp cho tất cả các chèn riêng biệt. Nếu sự khác biệt này không rõ ràng với bạn, tôi khuyên bạn nên tạo một câu hỏi mới: tham khảo hai câu hỏi này và hỏi tại sao câu trả lời có vẻ mâu thuẫn. – Rob

Các vấn đề liên quan