2009-06-02 35 views
12

Tôi đã chơi với một số LINQ ORM (LINQ trực tiếp đến SQL) và tôi phải thừa nhận rằng tôi thích sức mạnh biểu cảm của nó. Đối với các ứng dụng nhỏ như tiện ích, nó cũng hoạt động khá nhanh: thả một máy chủ SQL trên một số bề mặt và bạn được đặt thành linq.ORM (LINQ, Hibernate ...) thực sự hữu ích?

Đối với các ứng dụng lớn hơn tuy nhiên, DAL không bao giờ là lớn của một vấn đề đối với tôi để thiết lập, cũng không duy trì và thường xuyên hơn không, một khi nó đã được thiết lập, tất cả các chương trình đã không xảy ra ở đó anyway ...

Của tôi, trung thực - Tôi là một newbie ORM - câu hỏi: lợi thế lớn của ORM hơn bằng văn bản một DAL phong nha bằng tay là gì?

(có vẻ như một đôi, không thể tìm thấy nó mặc dù)

UPDATE: OK nó một :-) đôi tôi thấy nó bản thân mình cuối cùng:

ORM vs Handcoded Data Access Layer

+0

bản sao có thể có của [ORM vs Lớp truy cập dữ liệu được mã hóa] (http://stackoverflow.com/questions/563775/orm-vs-handcoded-data-access-layer) –

+0

Dễ dàng thực hiện tải chậm. –

+0

Dễ dàng duy trì biểu đồ đối tượng phức tạp đến/từ cơ sở dữ liệu. –

Trả lời

3

Tôi đã sử dụng JPA trong một dự án và lúc đầu tôi vô cùng ấn tượng. Gosh nó đã cứu tôi tất cả thời gian đó bằng văn bản SQL! Dần dần, tuy nhiên, tôi đã trở thành một chút disenchanted.

  1. Khó xác định bảng không có khóa thay thế. Đôi khi chúng ta cần các bảng không có khóa thay thế. Đôi khi chúng tôi muốn một khóa chính đa lõi.TopLink gặp khó khăn với điều đó.
  2. Các mối quan hệ cơ sở hạ tầng bắt buộc. JPA sử dụng chú thích để mô tả mối quan hệ giữa một trường và vùng chứa hoặc tham chiếu lớp. Mặc dù điều này có vẻ tuyệt vời ở trang web đầu tiên, bạn sẽ làm gì khi bạn tham chiếu các đối tượng khác nhau trong ứng dụng? Ví dụ, bạn chỉ cần các đối tượng cụ thể tham chiếu các bản ghi cụ thể dựa trên một số tiêu chí cụ thể (và nó cần phải có hiệu suất cao mà không cần phân bổ đối tượng không cần thiết hoặc truy xuất bản ghi). Nỗ lực sửa đổi các lớp Entity sẽ hầu như luôn vượt quá nỗ lực có thể tồn tại mà bạn chưa bao giờ sử dụng JPA ngay từ đầu (giả sử bạn hoàn toàn thành công khi nhận được JPA để làm những gì bạn muốn).
  3. Caching. JPA định nghĩa khái niệm cache cho các đối tượng của bạn. Nó phải được nhớ rằng cơ sở dữ liệu có bộ nhớ cache riêng của nó, thường được tối ưu hóa xung quanh giảm thiểu đọc đĩa. Bây giờ bạn đang lưu dữ liệu của bạn hai lần (bỏ qua đống GC chưa được thu thập). Làm thế nào điều này có thể là một lợi thế là ngoài tôi.
  4. Dữ liệu! = Đối tượng. Đối với các ứng dụng hiệu suất cao, việc truy xuất dữ liệu từ DB phải được thực hiện rất hiệu quả. Buộc tạo đối tượng không phải luôn luôn là một điều tốt. Ví dụ, đôi khi bạn có thể muốn mảng nguyên thủy. Đây là khoảng 30 phút làm việc cho một lập trình viên có kinh nghiệm làm việc với JDBC thẳng.
  5. Hiệu suất, gỡ lỗi. Thật khó để đánh giá hiệu suất của một ứng dụng với những điều phức tạp xảy ra trong hệ thống con (tối ưu, được tạo tự động) của bộ nhớ đệm, làm tăng thêm nguồn lực và ngân sách của dự án.

Hầu hết các nhà phát triển không thực sự hiểu được vấn đề không phù hợp trở kháng luôn tồn tại khi ánh xạ đối tượng vào bảng. Thực tế này đảm bảo rằng JPA và bạn bè có thể sẽ tận hưởng thành công đáng kể (ho ho) trong tương lai gần.

+0

Thật vậy, chính xác những trải nghiệm của tôi. – Peter

16
  • Strong-gõ
  • Không cần tự viết DAL => tiết kiệm thời gian
  • Không cần tự viết mã SQL => ít lỗi hơn-p rone
6

Tôi đã sử dụng Hibernate trong quá khứ để tự động tạo các truy vấn khá phức tạp. Logic liên quan đến việc tạo ra SQL thích hợp sẽ tốn rất nhiều thời gian để thực hiện, so với logic để xây dựng Criteria thích hợp. Ngoài ra, Hibernate biết làm thế nào để làm việc với các cơ sở dữ liệu khác nhau, vì vậy tôi không cần phải đặt bất kỳ logic nào trong mã của chúng tôi. Chúng tôi đã phải thử nghiệm đối với các cơ sở dữ liệu khác nhau và tôi cần viết một tiện ích mở rộng để xử lý các truy vấn "thích" một cách thích hợp, nhưng sau đó nó chạy với SQL Server, Oracle và HSqldb (để thử nghiệm) mà không có vấn đề gì.

Cũng có một thực tế là nó mã nhiều hơn bạn không cần phải viết, mà luôn luôn là một điều tốt đẹp :) Tôi không thể nói tôi đã sử dụng LINQ to SQL trong bất cứ điều gì lớn, nhưng nơi tôi đã sử dụng nó cho một trang web "nhanh chóng và bẩn" (rất nhỏ, hiếm khi được cập nhật, ít được hưởng lợi từ sự trừu tượng lớp đầy đủ) nó thật đáng yêu.

+0

Jon, tx, là nó cho java hay dotnet? Bạn có recommand NHibernate trên LINQ? – Peter

+0

@Peter tôi sẽ :) –

+0

@Peter: Đây là trong Java. Tôi không có nhiều kinh nghiệm về ORM trên .NET cho các ứng dụng sản xuất, thành thật mà nói. –

2

Khả năng di chuyển giữa các nhà cung cấp db khác nhau.

2

Tôi, trung thực - tôi là một người mới chơi ORM - câu hỏi: ĐẠT ORM lớn bằng cách viết một DAL phong nha bằng tay là gì?

Không phải tất cả các lập trình viên đều sẵn sàng hoặc thậm chí có khả năng viết "DAL phong nha". Những người không thể hoặc sợ hãi vì chỉ nghĩ về nó, hãy tìm LINQ hoặc bất kỳ ORM nào khác một phước lành.

Cá nhân tôi sử dụng LINQ để thao tác các bộ sưu tập trong mã do tính biểu cảm của nó. Nó cung cấp một cách rất nhỏ gọn và minh bạch để thực hiện một số tác vụ phổ biến trên các bộ sưu tập trực tiếp trong mã.

LINQ sẽ không hữu ích cho bạn khi bạn muốn tạo các truy vấn rất cụ thể và được tối ưu hóa bằng tay. Sau đó, bạn có khả năng để có được một hỗn hợp của các truy vấn LINQ xen kẽ với các thủ tục được lưu trữ tùy chỉnh có dây vào nó. Bởi vì những cân nhắc này, tôi đã quyết định chống lại LINQ to SQL trong dự án hiện tại của tôi (vì tôi có một lớp DAL phong nha (imho)). Nhưng tôi chắc chắn LINW sẽ làm tốt cho các trang web đơn giản như có thể blog của bạn (hoặc SO cho rằng vấn đề).

Với LINQ/ORM cũng có thể xem xét việc trễ cho các trang có lưu lượng truy cập cao (vì mỗi truy vấn đến sẽ phải được biên dịch lại). Mặc dù tôi phải thừa nhận tôi không thấy bất kỳ vấn đề hiệu suất nào trên SO.

Bạn cũng có thể xem xét việc đợi Khuôn khổ thực thể v2. Nó phải mạnh hơn LINQ (và hy vọng không phải là xấu như v1 (theo một số người)).

+3

"Mỗi truy vấn đến sẽ phải được biên dịch lại" - tôi chắc chắn sẽ không hy vọng! Một bộ nhớ cache báo cáo chuẩn bị nên loại bỏ vấn đề đó. –

+1

Bạn cũng có thể dây trong SP trong LINQ của bạn. Vì vậy, trước tiên bạn có thể tạo DAL thông qua LINQ và sau đó tối ưu hóa khi cần bằng cách gọi SP. –

+2

Việc biên dịch các truy vấn của bạn có thể được tối ưu hóa bằng cách gọi là Truy vấn được biên dịch. Bạn có thể tạo chúng một cách tĩnh để chúng chỉ được biên dịch một lần. Không biết nếu đây là những gì Jon đang đề cập đến, nhưng tôi nghĩ rằng tôi chỉ cần thả thuật ngữ để ppl có thể dễ dàng google nó. –

1

Độ bền trong suốt - thay đổi được lưu (và xếp chồng) mà không cần phải gọi số Save(). Thoạt nhìn, điều này có vẻ như là một cơn ác mộng, nhưng một khi bạn quen với việc làm việc với nó hơn là chống lại nó, mã miền của bạn có thể được giải thoát khỏi những lo ngại liên tục gần như hoàn toàn. Tôi không biết về bất kỳ ORM nào khác ngoài Hibernate/NHibernate mà thực hiện điều này, mặc dù có thể có một số ...

4

Vâng, đối với tôi rất nhiều việc không phải tái tạo lại/tạo lại bánh xe mỗi lần tôi cần để triển khai mô hình miền mới. Nó đơn giản hơn rất nhiều để sử dụng ví dụ nHibernate (ORM của tôi về sự lựa chọn) để tạo, sử dụng và duy trì lớp truy cập dữ liệu.

Bạn không chỉ định chính xác cách bạn xây dựng DAL của mình, nhưng đối với tôi, tôi đã sử dụng khá nhiều thời gian để làm những thứ tương tự lặp đi lặp lại. Tôi sử dụng để bắt đầu với mô hình cơ sở dữ liệu và làm việc theo cách của tôi từ đó, tạo ra các thủ tục lưu trữ vv. Ngay cả khi tôi đôi khi sử dụng các công cụ nhỏ để tạo ra các phần của thiết lập, nó đã được rất nhiều mã hóa lặp đi lặp lại.

Ngày nay tôi bắt đầu với miền. Tôi mô hình hóa nó trong UML và phần lớn thời gian tôi có thể tạo mọi thứ từ mô hình đó, bao gồm lược đồ cơ sở dữ liệu. Nó cần một vài điều chỉnh ở đây và ở đó, nhưng với thiết lập hiện tại của tôi, tôi nhận được 95% công việc với việc truy cập dữ liệu được thực hiện trong thời gian không ở tất cả. Thời gian tôi lưu tôi có thể sử dụng để tinh chỉnh các bộ phận cần điều chỉnh. Tôi hiếm khi cần phải viết bất kỳ câu lệnh SQL nào.

Đó là hai xu của tôi. :-)

0

Tôi đã sử dụng LINQ, tôi thấy nó rất hữu ích. Tôi tiết kiệm rất nhiều thời gian của bạn viết mã truy cập dữ liệu. Nhưng đối với các ứng dụng lớn, bạn cần nhiều hơn DAL, đối với chúng, bạn có thể dễ dàng mở rộng các lớp do nó tạo ra. Tin tôi đi, nó thực sự cải thiện năng suất của bạn.

1

Cách tốt nhất để trả lời câu hỏi là hiểu chính xác thư viện nào như Hibernate thực sự đang thực hiện thay cho bạn. Hầu hết các thời gian trừu tượng tồn tại vì một lý do, thường là để làm cho một số vấn đề ít phức tạp hơn, hoặc trong trường hợp Hibernate gần như là một DSL để biểu hiện một số khái niệm kiên trì theo một cách đơn giản.

  • Người ta có thể dễ dàng thay đổi chiến lược tìm nạp bộ sưu tập bằng cách thay đổi chú thích thay vì viết nhiều mã.

  • Hibernate và LINQ được chứng minh và thử nghiệm bởi nhiều người, có rất ít cơ hội bạn có thể đạt được chất lượng này mà không cần nhiều công việc.

  • Hibernate địa chỉ nhiều tính năng sẽ đưa bạn tháng và năm để mã.

1

Ngoài ra, trong khi tài liệu JPA cho biết các phím tổng hợp được hỗ trợ, nó có thể rất nhanh (rất) phức tạp một cách nhanh chóng. Bạn có thể dễ dàng dành hàng giờ (ngày?) Cố gắng để có được một cái gì đó khá đơn giản làm việc. Nếu JPA thực sự làm cho mọi việc đơn giản hơn thì các nhà phát triển nên được giải thoát khỏi suy nghĩ quá nhiều về những chi tiết này. Nó không, và chúng ta còn phải hiểu hai mức trừu tượng, ORM (JPA) và JDBC. Đối với dự án hiện tại của tôi, tôi đang sử dụng một triển khai thực hiện rất đơn giản, sử dụng một gói được bảo vệ tĩnh nhận "constructor" để lấy một ResultSet và trả về một Object. Đây là khoảng 4 dòng mã cho mỗi lớp, cộng với một dòng mã cho mỗi trường. Nó đơn giản, hiệu suất cao và khá hiệu quả, và tôi giữ lại toàn quyền kiểm soát. Nếu tôi cần truy cập các đối tượng khác nhau, tôi có thể thêm một phương thức khác để đọc các trường khác nhau (ví dụ như để trống các đối tượng khác). Tôi không yêu cầu một thông số kỹ thuật cho tôi biết "làm thế nào ORM phải (!) Được thực hiện". Nếu tôi yêu cầu bộ nhớ đệm cho lớp đó, tôi có thể thực hiện chính xác theo yêu cầu.