programing

BatchUpdateException: 배치가 종료되지 않습니다.

lovejava 2023. 9. 16. 08:20

BatchUpdateException: 배치가 종료되지 않습니다.

매우 큰 파일을 처리하여 오라클 데이터베이스(Java 6, oracle 9 사용)로 데이터를 전송하는 애플리케이션이 있습니다.

루프에서, 나는 A를 사용합니다.PreparedStatement ps를 사용하여 생성된 모든 SQL 문을 만듭니다.ps.addBatch().

제가 지금 상황이 있어서.BatchUpdateException bue어디론가 던져집니다.ps.executeBatch(). 이 시점에서 배치가 실행을 중지합니다.

배치 실행을 계속하여 실패한 업데이트를 방법으로 확인할 수 있기를 바랍니다.processUpdateCounts(bue.getUpdateCounts()).

클래스 BatchUpdateException에 대한 javadoc은 다음과 같이 말합니다.

배치 업데이트의 명령이 제대로 실행되지 않고 BatchUpdateException이 표시되면 드라이버는 배치의 나머지 명령을 계속 처리하거나 처리하지 않을있습니다.

계속을 강제할 수 있는 방법이 있습니까? 아니면 개별적으로 명령문을 실행하도록 프로그램을 변경해야 합니까?

방금 이 링크를 찾았습니다: JDBC 배치 업데이트 문제

보아하니, 거기에 그들이

ORACH BATCH JDBC에서는 첫번째 실패진행방법이 없습니다.

그래서 삽입물을 하나씩 보내려고 합니다.감사해요.

(이전에 위의 링크를 찾지 못해 미안합니다.)

배치 기능을 사용할 수 있는 해결 방법이 있습니다.단순 INSERT 문을 실행하는 대신, 오류를 적절히 처리할 PL/SQL 블록을 실행할 수 있습니다.

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

성능은 배치 인서트와 동등해야 합니다(문을 개별적으로 실행하는 것보다 빨라야 합니다).PL/SQL 블록 대신 저장 프로시저를 호출할 수도 있습니다.

Oracle 자체는 다음을 참조하십시오. http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14250/oci04sql.htm#sthref616

그러나 이 기능은 오라클 특정 클래스에서조차 JDBC에 노출되지 않는 것 같습니다.

JDBC 오류 처리가 다소 쓸모없기 때문에("드라이버는 계속할 수도 있고 그렇지 않을 수도 있다"), 저는 배치 전에 항상 저장 지점을 설정하고 오류 시 해당 지점으로 롤백을 수행합니다.이것이 오라클 배치 오류 후 알려진 상태를 확립할 수 있는 유일한 JDBC 준수 방법입니다. 제가 아는 한 말입니다.

사양서가 이를 의무화하는 것 같지는 않기 때문에(Javadoc에서 명확하게 보여주듯), 어떠한 "강제적인" 지속도 드라이버 단위로 수행해야 합니다.간단한 표준 준수 해결책은getUpdateCounts()배열을 반환하고 실패한 문에 대해 배치를 "재실행"합니다.재시도 횟수에 대한 논리를 추가하면 이 접근 방식을 좀 더 정교하게 만들 수 있습니다.

물론, 이는 다소 지저분한 것처럼 보이지만(추가된 "배치"를 추적한 다음 출력을 확인), 모든 데이터베이스와 드라이버 구현에서 작동할 것입니다.그냥 한가지 생각...

언급URL : https://stackoverflow.com/questions/4724957/batchupdateexception-the-batch-will-not-terminate