2008-12-19 26 views
6

Bị tụt hậu trong thế giới ORM và truy cập dữ liệu hiện đại, tôi đang tìm cách di chuyển ra khỏi DataSets (shudder) và vào một khung bản đồ thích hợp.NHibernate efficiency

Tôi vừa mới bắt đầu sử dụng LINQ to SQL, bây giờ tôi đang xem NHibernate với quan điểm sử dụng nó trong dự án tiếp theo của chúng tôi.

Với bộ dữ liệu và sql trường học cũ, truy vấn sql của bạn rõ ràng chỉ trả về dữ liệu bạn muốn. Tôi cũng hiểu rằng L2S ​​cũng đủ thông minh để đánh giá các mệnh đề của nó ở đâu để nó chỉ trả về các đối tượng bạn yêu cầu. NHibernate có giống nhau không? Và nó giống với Linq của Ayende với NHibernate?

Bằng cách này, tôi có nghĩa là, nếu tôi làm tương đương với:

Select * from customers where name = "fred" 

nó sẽ lấy tất cả các khách hàng vào bộ nhớ, và sau đó lọc ra các phi freds, hoặc là nó đủ thông minh để chỉ nhận được những gì nó cần ở nơi đầu tiên?

Nếu thông minh, hãy cẩn thận những gì? Có xác nhận loại truy vấn không thể được đánh giá theo cách này không? Tôi cần lưu ý những vấn đề về hiệu suất nào?

Cảm ơn

Andrew

Trả lời

8

Một câu trả lời nhanh chóng là ORM sẽ kiểm tra các tên thuộc tính và sẽ làm thay đổi nó vào một truy vấn SQL mà sẽ làm bạn name = .... Vì vậy, nó sẽ không tải tất cả các khách hàng vào bộ nhớ để tìm kiếm tên.

4

Nhibernate đi kèm với một vài cách khác nhau để truy vấn cơ sở dữ liệu. Hibernate sử dụng cú pháp Sql như HQL, là SQL trên các đối tượng. Ngoài ra nó có thể thực hiện tìm kiếm theo ví dụ, nơi bạn tạo một đối tượng và điền vào các critea bạn muốn, sau đó hibernate sẽ kéo đối tượng ra khỏi DB có cùng giá trị thuộc tính.

có một cái nhìn ở đây nó sẽ giúp bạn có được tốc độ summer of Nhibernate lession 2 và 2a sẽ trả lời sâu hơn

HTH

xương

1

Vâng, NHibernate nên là một trong những ORM performant nhất ngoài kia, tôi đã sử dụng trong một dự án và nó khá tuyệt. Giới thiệu LINQ to NHibernate you may want to check this article. Có một đường cong học tập (NHQL và ICriteria) và nếu bạn muốn thực hiện bước nhảy đầu tiên sẽ khó khăn, nhưng sau đó tất cả thời gian đầu tư sẽ trở lại với bạn. Hy vọng điều này sẽ hữu ích.

3

NẾU bạn thực sự lo lắng về những truy vấn NHibernate đang tạo, chạy SQL Server Profiler và tìm hiểu những gì đang chạy hoặc cấu hình nó đăng nhập và bật đầu ra SQL của nó. Nó sẽ hiển thị tất cả các câu lệnh SQL đến nơi bạn cấu hình log4net của nó.

+0

Im not * lo lắng * Tôi chỉ đang cố gắng thiết lập sự thật. Bạn đã từng xem hồ sơ nhibernate của Ayende chưa? –

+0

Tôi chỉ nhìn thấy những gì anh ta đưa vào blog của mình. Nó có vẻ thực sự gọn gàng. Vâng xin lỗi cho các phrasing, tò mò sẽ có được một từ tốt hơn. Tôi biết cá nhân rằng tôi đã thiết lập log4net để bắt một số kịch bản N + 1 khó chịu. – Min

1

NHibernate sẽ tạo một truy vấn tương tự với ví dụ của bạn cho dù bạn sử dụng HQL hoặc ICriteria nhưng nó thực sự sẽ giúp bạn tốt hơn. Nó sẽ tạo ra một câu lệnh sql parametrized để truy vấn có thể được lưu trữ trong SQL Server.

ICriteria cực kỳ linh hoạt, tuy nhiên có một chút đường cong học tập để trở nên thành thạo trong đó. Tôi cũng đề nghị mùa hè của screencasts nhibernate để có được lên đến tốc độ một cách nhanh chóng.

1

Thật đơn giản để đạt được hiệu suất lớp "doanh nghiệp" với NHibernate.

Dựa trên ánh xạ thuộc tính và quan hệ trong đối tượng ORM sẽ tạo truy vấn cụ thể cho tìm nạp đó. Nếu thuộc tính được đánh dấu là tải chậm thì nó sẽ bị loại trừ và khi thuộc tính được truy cập trong phiên, lần tìm nạp tiếp theo sẽ chỉ nhận được phần dữ liệu bị thiếu đó. Vì vậy, nếu chúng tôi đã bật SQL profiler, truy vấn được dịch sẽ giống như thế này

Select cust.Address, cust.Email from customers cust where cust.Name = "fred" 

Điều quan trọng là độ sâu truy vấn của bạn. Chúng tôi có thể giới hạn số lượng bản ghi được trả lại (quan trọng đối với bộ dữ liệu lớn) bằng cách sử dụng HQL truy vấn trang dữ liệu tùy thuộc vào nhà cung cấp cơ sở dữ liệu của bạn ... miễn là chúng hoạt động với trình phân tích cú pháp HQL. Bạn cũng có thể đặt FetchMode hoặc CollectionFetchMode trên ánh xạ quan hệ của bạn sẽ thực hiện các phép nối để chọn từ nhiều bảng trong một tương tác.

Nếu bạn đang sử dụng máy chủ SQL, bạn có thể bật sp_execsql sẽ chạy tất cả các lần tìm nạp thông qua một proc được lưu trữ để tăng hiệu suất nhanh.

Để biết thêm thông tin, có một bài viết tuyệt vời trên Code Project cung cấp chi tiết về cách cải thiện hiệu suất của NHibernate trong ứng dụng của bạn. Nếu bạn đang sử dụng một kiến ​​trúc hướng dịch vụ, độ trễ có thể là một mối quan tâm lớn. Hãy xem this thread để biết một số chi tiết về điều đó.

0

Phát triển LINQ to SQL đã bị loại bỏ đối với Linq thành Thực thể. Bạn cũng nên thử.