2009-02-09 32 views
5

Phải - Tôi muốn xóa (ví dụ: 1.000.000 bản ghi từ cơ sở dữ liệu. Quá trình này mất nhiều thời gian -> thời gian giao dịch hết và không thành công. Vì vậy - tôi xóa chúng theo lô nói 25000 bản ghi cho mỗi giao dịch. Sử dụng mệnh đề giới hạn trên MySQL hoặc ROWNUM trên Oracle. Tuyệt vời tác phẩm này.Xóa hàng loạt/xóa hồ sơ qua Java ORM

Tôi muốn thực hiện điều này theo cách độc lập với cơ sở dữ liệu. Và từ một cơ sở mã Java hiện có sử dụng JPA/Hibernate.

Không may mắn. JPA Query.setMaxResults và setFirstResult không có hiệu lực để ghi 'truy vấn' (ví dụ: xóa). Chọn nhiều thực thể vào bộ nhớ để xóa chúng riêng lẻ rất chậm và câm tôi muốn nói.

Vì vậy, tôi sử dụng truy vấn gốc và quản lý mệnh đề 'giới hạn' trong mã ứng dụng. Thật tuyệt khi đóng gói mệnh đề này trong tệp orm.xml nhưng ... "Chú thích Hibernate 3.2 không hỗ trợ cập nhật/xóa hàng loạt bằng truy vấn gốc". - http://opensource.atlassian.com/projects/hibernate/browse/ANN-469.

Tôi cho rằng đây là vấn đề phổ biến. Bất kỳ ai có giải pháp độc lập về cơ sở dữ liệu tốt hơn?

Trả lời

0

Giới hạn truy vấn là một tính năng cụ thể của cơ sở dữ liệu và không có tiêu chuẩn SQL (Tôi đồng ý có).

Giải pháp hoạt động với hầu hết các cơ sở dữ liệu đang sử dụng chế độ xem để nhóm nhiều bảng thành một. Mỗi bảng chứa một tập con của dữ liệu (nói một ngày). Điều này cho phép bạn thả toàn bộ tập hợp con cùng một lúc. Điều đó nói rằng, nhiều cơ sở dữ liệu có vấn đề với việc chạy UPDATE và INSERT trên một khung nhìn như vậy.

Bạn thường có thể làm việc xung quanh việc này bằng cách tạo chế độ xem hoặc bí danh cho INSERT/UPDATE (trỏ đến một bảng, bảng "hiện tại") và chế độ xem nhóm để tìm kiếm.

Một số cơ sở dữ liệu cũng cung cấp các phân vùng về cơ bản giống như vậy, ngoại trừ việc bạn có thể xác định một cột chỉ định trong đó một bảng bên dưới một hàng sẽ đi (trên INSERT). Khi bạn cần xóa một tập hợp con, bạn có thể thả/cắt bớt một trong các bảng bên dưới.

5

Tôi ghét đưa ra câu trả lời không mang tính xây dựng nhưng ORM không thực sự có nghĩa là thực hiện các hoạt động hàng loạt trên cơ sở dữ liệu. Vì vậy, có vẻ như bạn truy vấn gốc có lẽ là đặt cược tốt nhất cho các hoạt động này.

Bạn cũng nên đảm bảo rằng ORM của bạn được cập nhật để phản ánh trạng thái mới của cơ sở dữ liệu nếu không bạn có thể gặp phải một số điều kỳ lạ xảy ra.

ORM là công cụ tuyệt vời để ánh xạ đối tượng vào cơ sở dữ liệu, nhưng chúng không phải là giao diện cơ sở dữ liệu chung chung.

0

Tôi tin rằng bạn có thể sử dụng HQL (JPA QL) hoạt động DML trực tiếp mà sẽ bỏ qua bối cảnh kiên trì và bộ nhớ cache, và thực hiện (kết quả SQL) báo cáo trực tiếp:

Query q = session.createQuery("delete YourEntity ye where ye.something like :param"); 
q.setParameter("param", "anything"); 
int deletedEntities = q.executeUpdate(); 
+0

Tôi nghĩ rằng người hỏi đang thực hiện việc này, nhưng nhận thấy rằng quá trình xóa rất chậm. –

0

q.setMaxResults(int)

.. .sony

+0

OP đã chỉ ra rằng họ đã thử điều này không thành công: 'Rất may mắn. Truy vấn JPA.setMaxResults và setFirstResult không có tác dụng cho việc viết 'truy vấn' ... ' – Mac

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