2013-07-02 35 views
10

Chú thích @BatchSize của hibernate cho phép tìm nạp theo đợt các thực thể lười tải. Ví dụ. nếu tôi có một cái gì đó như:Tại sao tôi không sử dụng @BatchSize trên mọi mối quan hệ tải kém?

public class Product { 


    @OneToMany(fetchType=LAZY) 
    @BatchSize(size=10) 
    private ProductCategory category; 

} 

Bây giờ nếu tôi nhận được các chủng loại sản phẩm, Hibernate sẽ lấy loại lên đến hơn mười sản phẩm mà là trong phiên hiện tại và chưa có trường category của họ khởi tạo. Điều này tiết kiệm rất nhiều cuộc gọi SQL tới cơ sở dữ liệu. Càng xa càng tốt. Bây giờ tôi tự hỏi tại sao tôi không sử dụng chú thích @BatchSize trên MỌI mối quan hệ tải chậm? Sau tất cả lý do tại sao tôi muốn có thêm cuộc gọi đến cơ sở dữ liệu? Rõ ràng phải có một lý do cho điều này, nếu không thì những kẻ Hibernate có thể đã làm cho nó mặc định, nhưng tôi hiện không thể nhìn thấy nó.

+0

chỉ là một chỉnh sửa nhỏ. "Có hai cách bạn có thể cấu hình quyến rũ hàng loạt: vào mức độ lớp và mức thu" [(tài liệu)] (http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/performance. html # performance-fetching-batch). Vì vậy, bạn nên đặt '@ BatchSize' vào lớp' ProductCategory', không phải trên trường 'Product.category'. –

Trả lời

14

Tôi sẽ không trả lời cho câu hỏi của bạn trực tiếp nhưng tôi sẽ trả lời một câu hỏi chung chung hơn có thể được "Tôi đã tìm thấy một cái gì đó mà làm việc nhanh hơn đối với tôi, Tại sao không áp dụng nó ở khắp mọi nơi?"

Câu trả lời ngắn gọn là: Bạn không nên làm tối ưu hóa ưu tiên.

ngủ đông là một ORM tuyệt vời cho phép tất cả các loại tối ưu hóa. Bạn nên đo lường tất cả các quy trình gây ra sự cố (cổ điển N+1 ngay cả khi quá trình này nhanh, bất kỳ quy trình chậm nào, v.v.) và tối ưu hóa để giải quyết vấn đề.

Bạn có thể đạt được hiệu suất tốt hơn nhiều bằng cách háo hức tải một số thuộc tính vì bạn luôn sử dụng chúng, bạn có thể cần BatchSize của 100 cho một số khác vì bạn biết đó là số lượng quan hệ bạn có cho thuộc tính đó.

Cuối cùng, bạn không nên quan tâm đến tối ưu hóa trừ khi bạn cần để quan tâm đến điều đó. Và bạn cần phải quan tâm khi bạn đã thực hiện các phép đo và tìm ra các vấn đề.

7

tại sao tôi không sử dụng chú thích @BatchSize trên mọi mối quan hệ tải chậm?

Do đó là tối ưu hóa bạn có thể không cần trong mọi trường hợp. Batch lấy như thế này rất hữu ích khi ứng dụng của bạn sẽ truy cập product.category cho nhiều products khác nhau, vì vậy bạn có thể có một select from category... truy vấn duy nhất thực hiện chứ không phải N trong số họ.

Tuy nhiên, những gì nếu khi ứng dụng của bạn truy cập product.category cho một Product dụ, nó không có khả năng truy cập vào category lĩnh vực Product trường hợp khác trong cùng một phiên? Nếu bạn đã @BatchSize kích hoạt cho hiệp hội đó, sau đó bạn vừa nạp một số trường hợp khác Category vào phiên cho no gain - họ sẽ không bao giờ được sử dụng.

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