2012-05-03 39 views
7

Hãy xem xét một dịch vụ chỉ đọc mà cần phải thực hiện tìm kiếm thời gian thực của cơ sở dữ liệu sao lưu. Dịch vụ cần có khả năng tạo các truy vấn chọn khá phức tạp để tạo tóm tắt, báo cáo và kết quả dựa trên các đối tượng nhiều bảng. Các ưu tiên cho việc lựa chọn thư viện/khung là hiệu suất (của sql), bảo trì và tuổi thọ.So sánh các thư viện cho SQL động trong Java

Hibernate - Dường như yêu cầu "thủ thuật" để làm cho nó tạo ra đúng SQL, API tiêu chí trông đầy hứa hẹn nhưng cũng có một số hạn chế khi nói đến truy vấn tùy ý.

MyBatis - Không có API tiêu chí giống nhưng rõ ràng và sạch sẽ và thường không yêu cầu các thủ thuật và tweeks của Hibernate. Hạn chế cơ sở dữ liệu trừu tượng.

Một số giải pháp chưa được đánh giá khác bao gồm: SQLBuilder, Squiggle, Querydsl, JOOQ hoặc giải pháp tùy chỉnh.

Điều gì khiến người dùng SO thấy hoạt động tốt nhất để tạo dịch vụ tìm kiếm linh hoạt nhanh.

[cập nhật] - Một số thủ thuật và các vấn đề tôi đã phải đối mặt với Hibernate là ...

Nói chung, joi ning vào cùng một bảng hai lần dường như gây ra vấn đề. Tôi thậm chí đã quản lý để hibernate để sản xuất SQL đúng chỉ để có nó bản đồ kết quả sai bởi vì nó lưu trữ các ví dụ đầu tiên của thực thể và giả định các cột từ tham gia thứ hai, nơi dự phòng. Tham gia có điều kiện được thể hiện qua chú thích cũng rất đau đớn. Không nói điều đó là không thể nhưng rất khó hiểu và không trực quan.

Để trả lời X-Zero bên dưới, tôi muốn chuyển từ một đặc điểm kỹ thuật sang kết quả. Tức là, người tiêu dùng cho tôi biết họ biết gì và tôi xây dựng một truy vấn trả lời câu hỏi của họ một cách nhanh chóng. Trong thực tế, tôi dự định có một số giới hạn về những gì họ có thể đậu vào.

+0

Tâm chi tiết hơn về các "thủ thuật" ngủ đông mà bạn đang đề cập đến? Các truy vấn của bạn có chứa các mệnh đề lựa chọn bên trong không? Một vài ví dụ về các truy vấn phức tạp cũng sẽ giúp ích. – limc

+0

Và làm thế nào bạn mong đợi để có thể tạo các truy vấn này, nếu bạn không tự viết chúng? Bạn chỉ cần có một lối vào với các hộp kiểm (đối với những thứ như 'đã xảy ra trong quá khứ), hay một dạng xem mô hình nào đó (SQL mà tôi thấy từ đây thường không phải là tất cả những gì tuyệt vời, và nó có thể khó làm những thứ nâng cao trong giao diện như vậy). Và tôi giả sử rằng bạn ít nhất là khóa các đặc quyền người dùng cơ sở dữ liệu, nếu bạn cho phép SQL động do người dùng chỉ định. –

+0

@limic: xem cập nhật xin vui lòng, nó sẽ là một bình luận khá dài –

Trả lời

3

Đối với dịch vụ theo hướng truy vấn tôi khuyên bạn nên tránh xa khung công tác Hibernate hoặc tương tự JPA. MyBatis có thể là một lựa chọn tốt và nó cung cấp một số hỗ trợ kịch bản cơ bản để tự động xây dựng các truy vấn từ các đoạn SQL, nhưng bạn sẽ phải tự mình xử lý các phương ngữ SQL.

Ngoài ra, để thêm vào danh sách của bạn, cũng có các lớp Spring SQL TemplateJDBI, mặc dù cả hai đều không giải quyết được vấn đề với phương ngữ SQL.

3

Từ yêu cầu của bạn, tôi nghĩ rằng jOOQ sẽ là một kết quả phù hợp. Bạn cũng có đề cập jOOQ là một trong những khuôn khổ tiềm năng, vì vậy chúng ta hãy xem xét yêu cầu của bạn từ quan điểm của jOOQ:

Dịch vụ này cần có khả năng để tạo ra chọn truy vấn khá phức tạp

jOOQ mô hình SQL như một ngôn ngữ cụ thể trong miền trong Java.Điều này có nghĩa là SQL (hoặc một cái gì đó trông giống như SQL) được xây dựng bằng cách sử dụng các đối tượng và phương thức Java. Gần đây tôi đã viết blog về cách API DSL/fluent của jOOQ được xây dựng và tại sao nó cho phép xây dựng an toàn các truy vấn phức tạp tùy ý. Xem các bài viết trên blog đây (bao gồm cả một truy vấn khá phức tạp):

http://blog.jooq.org/2012/01/05/the-java-fluent-api-designer-crash-course/

để tạo ra bản tóm tắt, báo cáo và kết quả dựa trên các đối tượng đa bảng.

jOOQ bao trùm các tính năng tiên tiến OLAP sử dụng để tạo ra bản tóm tắt, báo cáo vv Hỗ trợ các tính năng bao gồm GROUPING SETS (CUBE(), ROLLUP()), bảng tổng hợp, truy vấn theo cấp bậc, chức năng cửa sổ, và SQL tùy ý.

Các ưu tiên cho các thư viện/lựa chọn khung là hiệu suất (của sql),

jOOQ tạo SQL theo cách bạn viết nó.

trì

tàu với một bộ tạo mã nguồn mẫu giản đồ cơ sở dữ liệu của bạn như mã Java jOOQ. Điều này tương tự như những gì Hibernate và/hoặc QueryDSL có khả năng làm. Khi lược đồ của bạn thay đổi, mã Java của bạn thay đổi (có thể dẫn đến lỗi biên dịch)

và tuổi thọ.

jOOQ đã trưởng thành và có tải xuống 10 nghìn hàng năm, đang phát triển. API đã rất ổn định thông qua các bản phát hành trước đây.

Hibernate - Dường như yêu cầu "thủ thuật" để làm cho nó tạo ra đúng SQL, API tiêu chí có vẻ hứa hẹn nhưng cũng có một số hạn chế khi nói đến truy vấn tùy ý.

Hibernate tạo HQL (hoặc JPQL), không phải SQL. Bạn không thể sử dụng đầy đủ các tính năng SQL với Hibernate.

MyBatis - Không có API tiêu chí giống nhưng rõ ràng và sạch sẽ và thường không yêu cầu các thủ thuật và tweeks của Hibernate.

Đó là một lựa chọn tốt, quá, cho những gì bạn đang nhắm đến để làm

TNHH cơ sở dữ liệu trừu tượng.

API của jOOQ giống nhau đối với mọi cơ sở dữ liệu cơ bản. SQL được tạo ra được tích hợp thử nghiệm với 13 RDBMS chính. Điều này bao gồm một loạt các chức năng, được dịch và/hoặc mô phỏng trong các cơ sở dữ liệu khác.Một ví dụ về điều này được đưa ra trong bài viết trên blog này, nơi mà các mô phỏng của khoản ON DUPLICATE KEY UPDATE MySQL trong RDBMS khác được mô tả:

http://blog.jooq.org/2012/05/01/how-to-simulate-mysqls-insert-statement-extensions/

Hoặc cách khéo léo xử lý đúng đắn về DUAL bảng có thể là:

http://blog.jooq.org/2011/10/16/sql-trouble-with-dummy-tables/

Tuyên bố từ chối trách nhiệm: Tôi là nhà phát triển của jOOQ, vì vậy câu trả lời này có thể hơi thiên vị.