2008-12-02 21 views
6

Tôi có một quy trình hàng loạt liên quan đến việc chọn ra một số lượng lớn các bản ghi và định dạng tệp để gửi tới hệ thống bên ngoài. Tôi cũng cần phải đánh dấu những hồ sơ này như được gửi để chúng không được truyền lại vào ngày mai.Hibernate có tốt cho xử lý hàng loạt không? Điều gì về việc sử dụng bộ nhớ?

Theo cách JDBC ngây thơ của tôi, tôi sẽ chuẩn bị và thực hiện một câu lệnh và sau đó bắt đầu lặp qua bản ghi âm. Vì tôi chỉ chuyển tiếp thông qua recordset nên không cần máy chủ ứng dụng của tôi giữ toàn bộ kết quả được đặt trong bộ nhớ cùng một lúc. Các nhóm bản ghi có thể được nạp dữ liệu từ máy chủ cơ sở dữ liệu.

Bây giờ, giả sử tôi đang sử dụng chế độ ngủ đông. Tôi sẽ không kết thúc với một loạt các đối tượng đại diện cho toàn bộ kết quả được đặt trong bộ nhớ cùng một lúc?

Trả lời

5

Hibernate cũng lặp qua tập kết quả để chỉ có một hàng được lưu trong bộ nhớ. Đây là mặc định. Nếu nó tải tham lam, bạn phải nói như vậy.

lý do để sử dụng Hibernate:

  • "Ai đó" là "sáng tạo" với các tên cột (PRXFC0315.XXFZZCC12)
  • Thiết kế DB vẫn là thay đổi liên tục và/hoặc bạn muốn một nơi mà cột tên được ánh xạ tới Java.
  • Bạn đang sử dụng Hibernate nào
  • Bạn có thắc mắc phức tạp và bạn không thông thạo SQL

Lý do không sử dụng Hibernate:

  • Phần còn lại của ứng dụng của bạn pure JDBC
  • Bạn không cần bất kỳ quyền lực nào của Hibernate
  • Bạn có các truy vấn phức tạp và bạn thông thạo SQL
  • Bạn cần một tính năng cụ thể của DB của bạn để làm cho SQL thực hiện
1

Theo ý kiến ​​của tôi, tôi sẽ KHÔNG sử dụng Hibernate, vì nó làm cho ứng dụng của bạn một tổng thể nhiều hơn và duy trì ít hơn và bạn không thực sự có cơ hội tối ưu hóa các tập lệnh sql được tạo theo cách nhanh chóng. Hơn nữa, bạn có thể sử dụng tất cả các chức năng SQL mà cầu JDBC hỗ trợ và không giới hạn chức năng ngủ đông. Một điều nữa là bạn cũng có những hạn chế đi kèm với mỗi lớp mã kế thừa.

Nhưng cuối cùng nó là một câu hỏi triết học và bạn nên làm theo cách nó phù hợp với bạn là cách suy nghĩ tốt nhất.

0

Nếu có các vấn đề về hiệu năng có thể xảy ra thì hãy tuân theo mã JDBC.

Có một số tối ưu hóa SQL thuần túy nổi tiếng mà sẽ rất khó thực hiện trong Hibernate.

Chỉ chọn các cột bạn sử dụng! (Không có nội dung "chọn *").

Giữ SQl càng đơn giản càng tốt. ví dụ. Không bao gồm các bảng tham chiếu nhỏ như mã tiền tệ trong tham gia. Thay vào đó, hãy nạp bảng tiền tệ vào bộ nhớ và giải quyết các mô tả tiền tệ bằng tra cứu chương trình.

Tùy thuộc vào thứ tự DBMS sắp xếp lại nhỏ của SQL nơi các vị từ có thể có ảnh hưởng lớn đến hiệu suất.

Nếu bạn đang cập nhật/chèn chỉ cam kết mỗi 100 đến 1000 cập nhật. tức là Không cam kết mọi đơn vị công việc nhưng giữ một số truy cập để bạn cam kết ít thường xuyên hơn.

Tận dụng các chức năng tổng hợp của cơ sở dữ liệu của bạn. Nếu bạn muốn tổng số bằng mã DEPT thì hãy thực hiện nó trong SQL bằng "SUM (số tiền) ... GROUP BY DEPT".

+0

Thay đổi phép chiếu chết dễ dàng trong Hibernate, bạn có thể lấy lại danh sách mô hình hóa lưới kết quả quan hệ hoặc Hibernate tạo một đối tượng cụ thể cho bạn bằng cách sử dụng SQL hoặc HQL gốc. Chức năng tổng hợp và GROUP BY cũng có sẵn trong API tiêu chí và trong HQL. –

2

Hibernate vì bất kỳ khung công tác ORM nào được thiết kế để phát triển và duy trì hệ thống dựa trên nguyên tắc lập trình hướng đối tượng. Nhưng hầu hết các cơ sở dữ liệu là quan hệ và không hướng đối tượng, vì vậy trong mọi trường hợp ORM luôn luôn là một thương mại tắt giữa lập trình OOP thuận tiện và truy cập DB tối ưu/hiệu quả nhất.

Tôi sẽ không sử dụng ORM cho các tác vụ cô lập cụ thể, mà đúng hơn là một lựa chọn kiến ​​trúc tổng thể cho lớp kiên trì ứng dụng.

3

Hibernate cung cấp một số khả năng để giữ phiên nhỏ.

Bạn có thể sử dụng Query.scroll(), Criteria.scroll() để cuộn giống như JDBC. Bạn có thể sử dụng Session.evict (đối tượng Object) để loại bỏ các thực thể khỏi phiên làm việc. Bạn có thể sử dụng StatelessSession để ngăn chặn việc kiểm tra bẩn. Và có một số tối ưu hóa hiệu suất hơn, xem tài liệu Hibernate.

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