- Có,
@BatchSize
được dùng với các liên tưởng lười biếng. - Hibernate vẫn sẽ thực thi nhiều câu lệnh trong hầu hết các trang web, ngay cả khi số lượng proxy / bộ sưu tập chưa được khởi tạo nhỏ hơn kích thước lô được chỉ định. Xem câu trả lời này để biết thêm chi tiết. Ngoài ra, nhiều truy vấn nhẹ hơn so với ít truy vấn lớn hơn có thể đóng góp tích cực vào thông lượng chung của hệ thống.
-
@BatchSize
ở cấp độ lớp có nghĩa là kích thước lô được chỉ định cho thực thể sẽ được áp dụng cho tất cả@*ToOne
liên kết lười biếng với thực thể đó. Xem ví dụ vớiPerson
thực thể trong tài liệu.
Câu hỏi / câu trả lời được liên kết mà bạn cung cấp quan tâm nhiều hơn đến nhu cầu tối ưu hóa và tải chậm nói chung. Tất nhiên, chúng cũng áp dụng ở đây, nhưng chúng không chỉ liên quan đến tải hàng loạt, đây chỉ là một trong những cách tiếp cận khả thi.
Một điều quan trọng khác liên quan đến việc tải háo hức được đề cập trong các câu trả lời được liên kết và điều này cho thấy rằng nếu một thuộc tính luôn được sử dụng thì bạn có thể nhận được hiệu suất tốt hơn bằng cách sử dụng tải háo hức. Điều này nói chung không đúng cho các bộ sưu tập và trong nhiều trường hợp cho cả các liên kết với một.
Ví dụ:giả sử bạn có thực thể sau bs
và cs
luôn luôn được sử dụng khi A
được sử dụng.
public class A {
@OneToMany
private Collection<B> bs;
@OneToMany
private Collection<C> cs;
}
Đang háo hức tải bs
và cs
rõ ràng là gặp phải vấn đề lựa chọn N + 1 nếu bạn không kết hợp chúng trong một truy vấn duy nhất. Nhưng nếu bạn kết hợp chúng trong một truy vấn, chẳng hạn như:
select a from A
left join fetch a.bs
left join fetch a.cs
sau đó bạn tạo sản phẩm đầy đủ của Descartes giữa bs
và cs
và trả về count(a.bs) x count(a.cs)
các hàng trong tập hợp kết quả cho mỗi a
được đọc từng cái một và được tập hợp thành các thực thể của A
và bộ sưu tập của họ về bs
và cs
.
Tìm nạp hàng loạt sẽ rất tối ưu trong trường hợp này, vì trước tiên bạn sẽ đọc A
s, rồi đến bs
rồi đến cs
, dẫn đến nhiều truy vấn hơn nhưng với tổng lượng dữ liệu được chuyển từ cơ sở dữ liệu ít hơn nhiều. Ngoài ra, các truy vấn riêng biệt đơn giản hơn nhiều so với một truy vấn lớn với các phép nối và cơ sở dữ liệu dễ thực thi và tối ưu hóa hơn.