작성
·
7
0
마지막 부분에 getBatchSize()
를 1000
정도 권장해주셨는데요.
jdbcTemplate.batchUpdate()
는 내부적으로 배치사이즈만큼 for문을 통해 반복하는것 같습니다. 즉 실제 처리해야할 대상 데이터가 1000
개가 넘는다면 1000
번째 이후 데이터부터는 INSERT
가 안될거고요.
만약 1000개 미만이라면 예를 들어 500개밖에 없다면 501번째 반복때 java.lang.ArrayIndexOutOfBoundsException
발생할것 같습니다.
만약 chunk가 최대 1000개정도가 적당하다라는 말씀이신거면 모르겠지만 1000으로 하드코딩해서 쓴다 라고 하신것처럼 와닿아서.. 오해의 소지가 있는것 같아 남깁니다~
private void bulkProcessSettlements(Map<Long, BigDecimal> settlementMap, LocalDate paymentDate) {
String sql = "INSERT INTO settlements (partner_id, total_amount, payment_date) VALUES (?, ?, ?)";
jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {
//
}
@Override
public int getBatchSize() {
return 1000;
}
});
}
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
dlsrksrhk님, jdbcTemplate.batchUpdate()
의 getBatchSize()
에 대한 질문에 답변드리겠습니다.
getBatchSize()
메서드는 배치 처리를 위한 사이즈를 지정하는 부분입니다. 이 값은 처리할 객체의 수에 따라 유동적으로 설정될 필요가 있습니다. 언급하신 것처럼 실제 데이터의 수가 1000
개 미만일 경우나 초과할 경우, 이 함수의 반환 값은 상황에 따라 조정되어야 합니다.
특히, 실제 settlementMap
의 사이즈를 고려하여 동적으로 getBatchSize()
를 설정하시길 권장합니다. 예를 들어:
@Override
public int getBatchSize() {
return settlementMap.size();
}
또한, 대량의 데이터를 처리할 때 적정한 배치크기를 정하는 것은 매우 중요합니다. 일반적으로 데이터베이스와의 연결 수, 메모리 사용 등을 고려하여 적절히 조정하여 성능을 최적화하는 것이 좋습니다. 이렇게 함으로써 ArrayIndexOutOfBoundsException
같은 예외가 발생하지 않도록 예방할 수 있습니다.
해당 설정을 상황에 맞게 조정하여 사용하시면 더 나은 성능과 안정성을 제공할 수 있을 것입니다. 도움이 되셨길 바랍니다!
자세한 내용은 관련 문서를 참고하실 수 있습니다:
Spring Boot JDBC Template