2016-07-27 2 views
2

batchUpdate를 사용하여 테이블에서 수천 개의 행을 업데이트하려고합니다. 내 요구 사항은 다음과 같습니다.오류 처리 Spring JdbcTemplate batchUpdate

1) 배치에 1000 개의 레코드가 있다고 가정합니다. 기록 번호 235로 인해 오류가 발생했습니다. 오류를 일으킨 레코드를 어떻게 찾을 수 있습니까?

2) 레코드 600이 업데이트되지 않았다고 가정합니다 (이유는 where 절과 일치하는 레코드가 아닐 수 있음). 업데이트를하지 않은 레코드를 어떻게 찾을 수 있습니까?

3) 위의 두 시나리오에서 어떻게 나머지 레코드 처리를 계속할 수 있습니까?

답변

2

긴 검색 및 디버그 후 유일한 해결책은 BatchUpdateException 클래스로 이동하여 음수 요소를 찾아 MAP에서 오류가있는 삽입 값을 추론하는 것입니다.

import java.sql.BatchUpdateException; 
import java.sql.PreparedStatement; 
import java.sql.SQLException; 
import java.sql.Statement; 
import java.util.List; 
import java.util.Map; 


import org.springframework.jdbc.core.BatchPreparedStatementSetter; 
import org.springframework.stereotype.Repository; 
import org.springframework.transaction.annotation.Propagation; 
import org.springframework.transaction.annotation.Transactional; 


@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) 
@Repository("dao_") 
public class YouDao extends CommunDao implements IyouDao { 

    public void bulkInsert(final List<Map<String, String>> map) 
      throws BusinessException { 
     try { 

      String sql = " insert into your_table " + "( aa,bb )" 
        + "values " + "( ?,?)"; 
      BatchPreparedStatementSetter batchPreparedStatementSetter = new BatchPreparedStatementSetter() { 
       @Override 
       public void setValues(PreparedStatement ps, int i) 
         throws SQLException { 
        Map<String, String> bean = map.get(i); 

        ps.setString(1, bean.get("aa")); 
        ps.setString(2, bean.get("bb")); 
        //.. 
        //.. 

       } 

       @Override 
       public int getBatchSize() { 
        return map.size(); 
       } 
      }; 

      getJdbcTemplate().batchUpdate(sql, batchPreparedStatementSetter); 

     } 

     catch (Exception e) { 
      if (e.getCause() instanceof BatchUpdateException) { 
       BatchUpdateException be = (BatchUpdateException) e.getCause(); 
       int[] batchRes = be.getUpdateCounts(); 
       if (batchRes != null && batchRes.length > 0) { 
        for (int index = 0; index < batchRes.length; index++) { 
         if (batchRes[index] == Statement.EXECUTE_FAILED) { 
          logger.error("Error execution >>>>>>>>>>>" 
            + index + " --- , codeFail : " + batchRes[index] 
            + "---, line " + map.get(index)); 
         } 
        } 
       } 
      } 
      throw new BusinessException(e); 
     } 

    } 

} 
+0

당신이 BatchUpdateException을 잡는 것을 보았습니다. 그러나 시도 할 때 클래스의 아무도 실제로 던져 버리지 않는다고 말했기 때문에 문법 오류가 발생했습니다. 당신의 예외는 무엇입니까? (그 이유는 그 getCause() 물건을하고있어?) – Steve

-2

INT [] 행 = jdbcTemplate.batchUpdate (TbCareQueryConstant.SQL_UPDATE_BANKDETAILS_OF_USER, 새로운 BatchPreparedStatementSe 라 자세 히() {

..... 코드

}에 대한

(int i = 0; i < rows.length; i ++) {

 if(rows[i] == 0){ 


     }  
    } 
+2

스택 오버플로에 오신 것을 환영합니다! 귀하의 답변에는 (부적절한 형식의) 코드 만 포함되어 있지만 설명이 부족합니다. [좋은 대답을 쓰려면 어떻게해야합니까?] (https://stackoverflow.com/help/how-to-answer)를 읽고 나서 대답을 편집하는 것이 좋습니다. – FanaticD

관련 문제