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
'programing' 카테고리의 다른 글
JDBC VS 동면 (0) | 2023.09.16 |
---|---|
"유명화�새"와 같이 데이터베이스를 마이그레이션한 후 알 수 없는 캐릭터 (0) | 2023.09.16 |
MySQL 쿼리 - SUM of COUNT 사용 (0) | 2023.09.16 |
최대값을 기준으로 테이블 결합 (0) | 2023.09.16 |
행의 ID로 다른 테이블에 연결된 행이 2개 이상인 이름을 가져오는 방법 (0) | 2023.09.16 |