2012-07-02 2 views
15

내 프로그램을 실행할 때마다 JDBC 배치 삽입 (한번에 약 1000 행 씩 삽입)을 수행하고 있습니다. 하지만 일부 레코드에 의해 발생한 예외를 제대로 처리 할 수 ​​없습니다.JDBC 일괄 삽입 예외 처리

데이터가 유효하지 않거나 일부 값의 크기가 열 크기를 초과하여 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 번째 레코드에서만 프로세스를 트리거하려고합니다. 이 작업을 수행 할 수있는 방법이 있습니까? 이후 예외를 던진 레코드에서 프로세스를 다시 시작할 수 있습니까? 이것을 달성하는 방법?

+2

코드가 있습니까? 내 원래 게시물에 – Alfabravo

답변

0

코드를 보지 않고 삽입 할 코드 주위에 try/catch 블록을 두는 것이 좋습니다. 또한 각 삽입에 삽입 (트랜잭션 연결이라고 가정)을 커밋해야 할 수도 있습니다. 이렇게하면 약간 느린 처리가되지만 프로그램을 계속 사용할 수 있습니다.

더 깨끗한 접근법은 삽입하기 전에 레코드의 사전 유효성 검사를 시도하는 것입니다. 한 번에 1000 개의 레코드 만 말하는 경우에는 처리 부하가 많이 발생하지 않아야합니다.

+0

제안/도움? – user182944

25

당신은 executeBatch을 사용하고 있다고 가정하므로 SQL 문의 일괄 처리를 실행한다고 명시합니다. executeBatch 일괄 처리 명령문을 사용하면 일부 명령문이 성공하고 명령문 중 일부가 실패 할 수 있습니다. 하나의 명령문이 실패하면, 이는 JDBC 드라이버가 성공한 명령문을 롤백한다는 것을 의미하지는 않습니다. JDBC 드라이버는 하나의 명령문이 실패하거나 명령문이 실패하면 배치에서 명령문 실행을 중지하도록 선택할 수있는 일괄 처리의 모든 명령문을 실행하려고 시도 할 수 있습니다 (사용중인 드라이버가 곧 실패로).

일괄 처리에서 하나의 명령문이 실패 할 경우 BatchUpdateException이 표시됩니다. 예외 처리기에서 getUpdateCounts에 전화해야합니다. 그러면 배열이 표시됩니다.이 행은 명령문이 얼마나 많은 행을 업데이트했는지, 문이 성공했음을 나타내는 Statement.SUCCESS_NO_INFO을 사용할 수 있지만 행 수를 사용할 수 없거나 문이 실패했음을 나타내는 Statement.EXECUTE_FAILED을 나타냅니다. 처음 99 개의 명령문이 성공하고 100 번째 명령문이 오류를 생성하고 나머지 명령문은 실행되지 않으면 첫 번째 99 개의 요소가 성공을 나타내고 100 번째 요소가 Statement.EXECUTE_FAILED을 나타내는 100 개의 요소 배열을 가져와야합니다. 그런 다음 코드는 실행되지 않은 명령문 (이 경우 명령문 101-1000)을 다시 시도해야합니다.

+0

내 제안 게시물에 대한 제안/도움? – user182944