공부/JAVA

JAVA PreparedStatement addBatch,executeBatch 사용 중 에러처리 (BatchUpdateException)

JangGiraffe 2020. 11. 10. 16:47

쿼리속도를 올리기 위해 preparedStatement 클래스의 addBatch,executeBatch 매서드를 이용하는 경우가 있다.

나도 대용량의 엑셀데이터를 DB에 넣기 위해 위 메서드를 이용했는데,  데이터를 인서트하다가 오류가 나는 경우가 있었는데, 문제는 배치를 사용했을 때 오류가 어디서 발생했는지 에러코드를 트래킹할 수가 없다는 점이다.

executeBatch() 실행 중 에러발생 시 대략 이런식으로 나온다.

com.ibm.db2.jcc.am.BatchUpdateException: [jcc][t4][102][10040][3.65.77] Batch failure.  The batch was submitted, but at least one exception occurred on an individual member of the batch.

또는

Non-atomic batch failure. The batch was submitted, but at least one exception occurred on an individual member of the batch.
Use getNextException() to retrieve the exceptions for specific batched elements.


비atomic 일괄처리에 실패했습니다. 일괄처리가 제출되었지만 각 일괄처리 구성원에서 최소 한 개의 예외가 발생했습니다.
 
getNextException()을 사용하여 특정 일괄처리 요소에 대한 예외를 검색하십시오.

executeBatch 메서드 사용 시 어느쿼리에서 오류가 발생했는지 확인하기 위해서는 SQLException 객체의 getNextException()매서드를 이용하면 된다. 이 메서드를 사용해서 에러를 전부 찍어주는 방법이다.
사용법은 아래와 같다.

try{
    preparedstatement.executeBatch();
}catch(SQLException e){
    while(e!=null){
        e.printStackTrace();
        e=e.getNextException();
    }
}

해당 소스를 적용하고 오류메시지를 확인해보니 8544번째 데이터가 중복되어 문제가 됐었던 것이다.!

com.ibm.db2.jcc.am.SqlIntegrityConstraintViolationException: Error for batch element #8544: DB2 SQL Error: SQLCODE=-803, SQLSTATE=23505, SQLERRMC=1;IBEINST.TBPAYFARERULECHA, DRIVER=3.65.77

마무리를 어떻게하지.. 그럼 이만 !

반응형