Dự án của tôi đang sử dụng ngủ đông với trình quản lý giao dịch mùa xuân và cơ sở dữ liệu của tôi là postgres (có thể không liên quan).xử lý hạn chế cơ sở dữ liệu hibernate
Tôi đang cố gắng đọc các tệp xml lớn và xây dựng các đối tượng ra khỏi các tệp đó (các đối tượng không lớn nhưng số lượng là) và chèn chúng vào cơ sở dữ liệu.
Nếu một số cơ hội của một trong các đối tượng của tôi vi phạm ràng buộc cơ sở dữ liệu thì toàn bộ quá trình sẽ dừng. Làm thế nào tôi có thể bỏ qua những cái vi phạm ràng buộc cơ sở dữ liệu? cách khác đăng nhập id của họ hoặc bất cứ điều gì để một tập tin đăng nhập?
Câu hỏi cập nhật:
Tôi đã xem máng SO và thấy rằng cho chèn hàng loạt nó tốt nhất nên sử dụng phiên Stateless nhưng tôi vẫn nhận được cùng một vấn đề và chèn dừng:
May 26, 2012 4:45:47 PM org.hibernate.util.JDBCExceptionReporter logExceptions
SEVERE: ERROR: duplicate key value violates unique constraint "UN_FK"
Detail: Key (fid)=(H1) already exists.
Dưới đây là các phần liên quan của mã của tôi để phân tích cú pháp xml và chèn vào db, để đơn giản giả sử tôi đang chèn phim:
//class field
@Autowired
private SessionFactory sessionFactory;
@Override
public void startDocument() throws SAXException {
session = sessionFactory.getCurrentSession();
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if (qName.equalsIgnoreCase("FILM")) {
movie.setCategory(category);
movie.setAdded(new Date());
session.insert(movie);
}
}
Tôi và có thuộc tính này được đặt trong ứng dụng-ctx hibernate.jdbc.batch_size
đến 100. Có thực sự cần thiết phải chọn trước khi chèn để tránh điều này không?
Cập nhật 2:
Nếu tôi sử dụng StatelessSession
thay phiên, tôi nhận được arround 20 chèn và so với điểm dừng xử lý vô thời hạn mà không cần bất kỳ ngoại lệ hoặc bất cứ điều gì.
Tôi giả định số 20 là vì tôi đang gộp các kết nối với tomcat và có maxActive="20"
.
Bounty Cập nhật:
tôi thực sự thích nhìn thấy giải pháp có người phục vụ (không có phòng thủ chọn nếu có thể). Sử dụng statelessSession hoặc chỉ phiên.
Một câu lệnh try catch đơn giản sẽ không làm. Một khi ngoại lệ được ném bởi Hibernate, trạng thái phiên là không mạch lạc, giao dịch phải được khôi phục và phiên đã đóng. Hơn nữa, ngoại lệ sẽ chỉ được ném vào thời gian xả, lâu sau khi bản ghi bị lỗi đã được duy trì. –
Đây là lý do tại sao nó được khuyến khích sử dụng một phiên Hibernate không trạng thái cho các trường hợp như vậy. Nó sẽ ngăn chặn trạng thái không mạch lạc và cũng làm giảm mức tiêu thụ bộ nhớ (hoặc bạn sẽ không phải loại bỏ các thực thể đã được xử lý) –