JDBC 배치 삽입 예외 처리
프로그램이 실행될 때마다 JDBC 배치 삽입(한 번에 약 1000줄 삽입)을 수행하고 있습니다.하지만 저는 몇몇 기록들에 의해 던져진 예외를 제대로 처리할 수 없습니다.
1000개 레코드 중 100번째 레코드가 잘못된 데이터 또는 일부 값의 크기가 열 크기를 초과하여 예외를 발생시킨다고 가정합니다.일단 예외가 발생하면 나머지 레코드는 삽입되지 않고 그 사이에 프로그램이 실패합니다.
제가 원하는 것은 100번째 레코드가 예외를 던지고 있더라도 프로그램이 종료되기 전에 남은 삽입이 정상적으로 이루어져야 한다는 것입니다.
나는 이것을 어떻게 달성해야 하는지 이해할 수 없습니다.제안해 주세요.
편집:
여기 제 앱에서 일괄 삽입을 위해 사용하고 있는 샘플 코드가 있습니다.결과 세트에 약 1000개의 레코드가 있다고 가정합니다.
PreparedStatement ps = null;
while(rs.next()){
//Retrieve the value and set it to a Prepared statement
String name = rs.getString("Name");
int age = rs.getInt("Age");
ps.setInt(1, age);
ps.setString(2, name);
//Finally invoke addBatch
ps.addBatch();
}
//Finally call the executeBatch method
ps.executeBatch();
100번째 레코드에서 예외가 발생하는 경우에는 100번째 레코드에서 1000번째 레코드까지만 프로세스를 트리거하려고 합니다.예외를 던진 레코드에서 끝까지 프로세스를 다시 시작할 수 있는 방법이 있습니까?어떻게 이를 달성할 수 있습니까?
당신이 SQL 문 배치를 실행하고 있다고 말했기 때문에 저는 당신이 사용하고 있다고 생각합니다.executeBatch당신이executeBatch문 배치, 일부 문은 성공하고 일부 문은 실패할 수 있습니다.하나의 문이 실패하더라도 JDBC 드라이버가 성공한 문을 롤백하지는 않습니다.JDBC 드라이버는 하나의 문이 실패하면 배치의 모든 문을 실행하도록 선택할 수도 있고, 문이 실패하면 배치의 문 실행을 중지하도록 선택할 수도 있습니다(사용 중인 드라이버가 오류가 발생하면 즉시 문 실행을 중지하도록 선택하는 것처럼 들립니다).
일괄 처리에서 하나의 문이 실패하면 다음과 같이 됩니다.BatchUpdateException예외 처리기에서 다음을 호출해야 합니다.getUpdateCounts그것은 당신에게 일련의 것을 줄 것입니다.int문이 업데이트된 행 수를 알려줍니다.Statement.SUCCESS_NO_INFO문은 성공했지만 사용 가능한 행 수가 없음을 나타냅니다. 또는Statement.EXECUTE_FAILED문이 실패했음을 나타냅니다.처음 99개의 문이 성공하고 100번째 문이 오류를 생성하며 나머지 문이 실행되지 않으면 처음 99개의 요소가 성공을 나타내고 100번째 요소가 성공을 나타내는 100개의 요소 배열을 반환해야 합니다.Statement.EXECUTE_FAILED그런 다음 코드는 실행되지 않은 문(이 경우 문 101-1000)을 다시 시도해야 합니다.
코드가 보이지 않는 한, 제가 할 수 있는 최선의 조언은 삽입하는 코드에 트라이/캐치 블록을 감는 것입니다.또한 각 삽입에서 트랜잭션 연결을 가정하여 삽입을 커밋해야 합니다.이렇게 하면 처리 속도가 약간 느려지지만 프로그램을 계속 진행할 수 있습니다.
삽입하기 전에 기록을 사전 검증하는 것이 더 깨끗한 방법일 것 같습니다.한 번에 1,000개의 레코드만 사용하는 경우에는 처리 부하가 크지 않습니다.
언급URL : https://stackoverflow.com/questions/11298220/jdbc-batch-insert-exception-handling
'programing' 카테고리의 다른 글
| 전체 파일 경로에서 파일 이름 찾기 (0) | 2023.06.21 |
|---|---|
| iOS용 Firebase, GoogleService-Info.plist 속성 "IS_ANALYATIC_ENABLED"가 "아니오"로 설정됨 (0) | 2023.06.21 |
| NextJS Myslog INSERT는 phpmyadmin을 통한 명령에서는 작동하지만 api의 쿼리에서는 작동하지 않습니다. (0) | 2023.06.21 |
| 병합 사용 중...source.id 과 target.id 사이의 매핑을 가져오는 출력 (0) | 2023.06.21 |
| TSQL에서 증분 날짜의 결과 집합 생성 (0) | 2023.06.21 |