2009-08-03 35 views
8

Tôi đang sử dụng trong ứng dụng của tôi một hỗn hợp Spring/Hibernate (không có gì nguyên gốc). Đối với một tính năng nhất định, tôi phải nhập nội dung của tệp CSV vào bảng của Oracle DB của tôi. Còn bây giờ, tôi Juste tạo các đối tượng, tôi làmChèn số lượng lớn với Spring/Hibernate

HibernateTemplate.saveOrUpdate 

trên mỗi trong số họ (tôi cần phải lấy của họ mới được phân bổ Id)

Sau đó giao dịch xảy ra ở phần cuối của phương pháp này, bằng cách sử dụng API giao tác mùa xuân.

Tất cả mọi thứ hoạt động tốt, ngoại trừ thực hiện, đó là chính xác cho các đối tượng số 5000, nhưng không phải cho 100 000 ...

Vì vậy, tôi tìm kiếm ý tưởng để thúc đẩy công cụ này. Tôi đã nghe nói về chèn số lượng lớn với Hibernate, nhưng không thể tìm thấy bất kỳ tài liệu tham khảo vững chắc. Ai có thể cho tôi một số ý tưởng để thực hiện việc nhập khẩu này với hiệu suất cao hơn không?

+1

Không có nghĩa là bị giật ở đây, nhưng tài liệu về điều này khá ngắn gọn và chỉ mất 5 phút để đọc: http://docs.jboss.org/hibernate/stable/core/reference/en/html /batch.html – Tim

+0

Cảm ơn bạn đã liên kết, đó chính xác là những gì tôi đang tìm kiếm. Tôi đã làm một số nghiên cứu trước và không tìm thấy nó, nhưng tôi là một newbie liên quan đến đào trong tài liệu Hibernate. Liên kết –

Trả lời

7

Something đơn giản bạn có thể thử là để tuôn ra và xóa phiên nói mỗi 100 đối tượng ...

để thực hiện

session.flush(); 
session.clear(); 

mỗi 100 hoặc 1000 chèn.

Điều đó sẽ tuôn ra và xóa phiên ngủ đông và dừng phát triển quá lớn (có thể lý do tại sao 100 000 đối tượng của bạn mất quá nhiều thời gian).

Ngoài ra nếu bạn đang sử dụng trình tạo mã nhận dạng nhận dạng hibernate sẽ tự động tắt các lần chèn hàng loạt. Chèn hàng loạt sẽ cải thiện hiệu suất. Bạn cũng cần phải chỉ định thuộc tính cấu hình hibernate.jdbc.batch_size tương đương với 100 của bạn tại một số thời gian.

Java Persistence Manning với Hibernate là nguồn gốc của điều này (cuốn sách tuyệt vời - đã lưu da của tôi nhiều lần).

6

Bạn cũng có thể xem xét sử dụng StatelessSession vì nó được thiết kế cho hoạt động hàng loạt.

StatelessSession ss=sessionFactory().openStatelessSession(); 
Transaction tx=ss.beginTransaction(); 
+1

sai: https://www.hibernate.org/hib%5Fdocs/v3/api/org/hibernate/StatelessSession.html –

+0

hiện tại, cả hai liên kết đều sai. đây là liên kết mới: http://docs.jboss.org/hibernate/orm/3.3/api/org/hibernate/StatelessSession.html – Isaac

3

Đôi khi một ORMapper không phải là búa phù hợp cho móng tay. Đặc biệt là các phép toán lô thường được thực thi tốt hơn bằng cách sử dụng JDBC cũ thuần túy. Điều này tất nhiên phụ thuộc vào nhiều điều kiện nhưng bạn ít nhất nên xem điều này như là một lựa chọn và so sánh hiệu suất của cả hai cách tiếp cận.

0

Nó không hoàn toàn là một vấn đề hiệu suất chèn cơ sở dữ liệu; nếu bạn đang tạo hàng chục nghìn đối tượng và không thực hiện lệnh xả, phiên Hibernate sẽ phát triển cho đến khi bạn hết bộ nhớ.

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