programing

JDBC 배치 삽입 예외 처리

itmemos 2023. 6. 21. 22:23
반응형

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

반응형