2011-01-18 37 views
9

Tôi có một ứng dụng xử lý một tệp rất lớn và gửi dữ liệu đến một cơ sở dữ liệu oracle (sử dụng Java 6, oracle 9).BatchUpdateException: lô sẽ không chấm dứt

Trong vòng lặp, tôi sử dụng PreparedStatement ps và tạo tất cả các câu lệnh SQL được tạo với ps.addBatch().

Tôi có một tình huống mà một BatchUpdateException bue được ném đâu đó trong ps.executeBatch(). Tại thời điểm đó, lô dừng lại để được thực hiện.

Tôi muốn thực hiện hàng loạt tiếp tục, để tôi có thể kiểm tra các cập nhật không thành công theo phương thức processUpdateCounts(bue.getUpdateCounts()).

Các javadoc về lớp BatchUpdateException nói:

Sau một lệnh trong một cập nhật hàng loạt không thực thi đúng và một BatchUpdateException được ném, tài xế thể hoặc không thể tiếp tục để quá trình các lệnh còn lại trong lô .

Có cách nào để thực thi việc tiếp tục hay tôi cần phải thay đổi chương trình của mình để chương trình sẽ thực thi câu lệnh riêng lẻ?

Trả lời

5

chỉ tìm thấy liên kết này: JDBC Batch Update Problem

Rõ ràng, nó nói có có

NO WAY VỚI ORACLE BATCH JDBC để tiến hành sau khi thất bại đầu tiên,

vì vậy tôi đang sử dụng để gửi từng đoạn mã. Cảm ơn bạn

(xin lỗi vì không tìm kiếm tốt hơn để tìm liên kết ở trên trước đây).

0

Vì đặc điểm kỹ thuật dường như không chỉ định nó (như được minh họa rõ ràng bởi Javadoc), nên việc tiếp tục "cưỡng bức" sẽ phải được thực hiện trên cơ sở mỗi trình điều khiển. Một giải pháp tuân thủ tiêu chuẩn đơn giản sẽ là kiểm tra mảng trả về getUpdateCounts() và "chạy lại" lô cho những câu lệnh không thành công. Bạn có thể làm cho phương pháp này phức tạp hơn một chút bằng cách đặt vào một logic cho số lần thử lại. Chắc chắn, điều này có vẻ hơi lộn xộn (theo dõi "lô" được thêm vào và sau đó kiểm tra đầu ra) nhưng sẽ hoạt động trên tất cả các cơ sở dữ liệu và triển khai trình điều khiển. Chỉ cần một ý nghĩ ...

3

có giải pháp thay thế cho phép bạn sử dụng tính năng lô. Thay vì thực hiện một câu lệnh INSERT đơn giản, bạn có thể thực hiện một khối PL/SQL sẽ đối phó với các lỗi một cách thích hợp:

BEGIN 
    INSERT INTO your_table VALUES (?,?,...?); 
EXCEPTION 
    WHEN OTHERS THEN 
     /* deal with the error. For example, log the error id and error msg 
     so that you can list them after the batch */ 
     INSERT INTO error_table VALUES (?, sqlerrm); 
END 

Việc thực hiện phải được ngang hàng với chèn hàng loạt (nên nhanh hơn so với thực hiện riêng lẻ của các câu lệnh). Bạn cũng có thể gọi một thủ tục được lưu trữ thay vì một khối PL/SQL.

1

Oracle chính nó có thể, xem tại đây: http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14250/oci04sql.htm#sthref616

Tuy nhiên, nó dường như không phải là chức năng này được tiếp xúc với JDBC, thậm chí không có trong lớp học cụ thể oracle.

Vì xử lý lỗi JDBC khá vô ích ("trình điều khiển có thể hoặc không thể tiếp tục"), tôi luôn đặt điểm lưu trước lô và thực hiện khôi phục đến điểm đó do lỗi. Đó là cách tương thích JDBC duy nhất để thiết lập một trạng thái đã biết sau một lỗi Oracle Batch - theo như tôi biết.

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