2009-02-24 30 views
5

Tôi có một đồ thị đối tượng khá sâu (5-6 nút), và khi tôi đi qua các phần của nó NHProf là nói với tôi tôi đã có một "Chọn N + 1" vấn đề (mà tôi làm).Ngăn cản NHibernate chọn n + 1

Hai giải pháp tôi biết là

  1. Háo hức tải con
  2. phá vỡ đồ thị của tôi đối tượng (và tải háo hức)

Tôi không thực sự muốn làm một trong hai trong số này (mặc dù tôi có thể phá vỡ đồ thị ngoài sau khi tôi thấy nó phát triển)

Hiện tại ....

Có thể nói NHibernate (với FluentNHibernate) rằng bất cứ khi nào tôi cố gắng truy cập vào trẻ em, để tải tất cả trong một lần, thay vì chọn-n + 1-ing khi tôi lặp qua chúng?

Tôi cũng nhận được "tập hợp kết quả không bị chặn", có lẽ là cùng một vấn đề (hoặc đúng hơn, sẽ được giải quyết bằng giải pháp trên nếu có thể).

Mỗi bộ sưu tập trẻ em (trong suốt biểu đồ) sẽ chỉ có khoảng 20 thành viên, nhưng 20^5 là rất nhiều, vì vậy tôi không muốn tải mọi thứ khi tôi nhận được thư mục gốc, nhưng đơn giản là lấy tất cả bộ sưu tập trẻ em bất cứ khi nào tôi đến gần.

Chỉnh sửa: một suy nghĩ ... nếu tôi muốn giới thiệu phân trang khi tôi muốn kết xuất trẻ em thì sao? Tôi có phải phá vỡ đồ thị đối tượng của tôi ở đây không, hoặc có một số lén lút tôi có thể sử dụng để giải quyết tất cả những vấn đề này?

Trả lời

9

Có vẻ như tôi muốn theo đuổi cách tiếp cận sử dụng mô hình miền của bạn thay vì tạo truy vấn nhibernate cụ thể để xử lý trường hợp này. Với điều này, tôi khuyên bạn nên xem xét thuộc tính kích thước lô mà bạn có thể áp dụng cho bộ sưu tập của mình. Giao diện thông thạo thành thạo NHibernate chưa hỗ trợ thuộc tính này, nhưng như một tác phẩm xung quanh bạn có thể sử dụng:

HasMany(x => x.Children).AsSet().SetAttribute("batch-size", "20") 

Do thiếu chung của thông tin về kịch bản chính xác của bạn, tôi không thể nói chắc chắn cho dù hàng loạt kích thước là giải pháp lý tưởng, nhưng tôi chắc chắn khuyên bạn nên cho nó một đi. Nếu bạn chưa sẵn sàng, tôi đề nghị bạn đọc sau đây:

http://www.nhforge.org/wikis/howtonh/lazy-loading-eager-loading.aspx

http://nhibernate.info/doc/nhibernate-reference/performance.html

Các NHibernate tài liệu hướng dẫn thực hiện sẽ giải thích hàng loạt kích thước tác phẩm như thế nào.

Chỉnh sửa: Tôi không biết bất kỳ cách nào để trang từ mô hình miền của bạn. Tôi khuyên bạn nên viết các truy vấn NH cho các kịch bản mà yêu cầu phân trang.

+0

"Có vẻ như tôi muốn theo đuổi cách tiếp cận sử dụng mô hình miền của bạn thay vì tạo truy vấn nhibernate cụ thể để xử lý trường hợp này". chắc chắn. điều cuối cùng tôi muốn là truy vấn cụ thể. Hãy kiểm tra xem công cụ đó ra sao, ta –

+3

lưu ý -> giao diện lưu loát hiện giờ hỗ trợ thuộc tính BatchSize() – KevinT

0

Chỉnh sửa: một suy nghĩ ... nếu tôi muốn giới thiệu phân trang khi tôi muốn để hiển thị trẻ em? Tôi có phải phá vỡ đồ thị đối tượng của tôi ở đây không, hoặc có một số sự lén lút nào đó mà tôi có thể sử dụng để giải quyết tất cả các vấn đề này không?

Vâng, nếu bạn chỉ tải các trẻ em thì bạn có thể trang chúng :). Nhưng nếu bạn muốn một cái gì đó như: LoadParent và PageChildren, sau đó tôi không nghĩ rằng bạn có thể làm điều đó.

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