Bulk Insert 하기

19·2023년 6월 4일
0

JPA

목록 보기
17/18

배경

특정 시간에 데이터를 저장할 일이 생겼다.
JPA의 saveAll 메소드로 처리했는데 내가 기대한 동작과는 달리 하나씩 Insert가 되었다.

조금이라도 성능을 향상시키기 위해 한번에 Insert 하고 싶었다.

알아보니 JPA에서 @GeneratedValue의 strategy가 IDENTITY면 Bulk Insert가 불가능하다는 걸 알게 되었다.
(MySQL을 사용하고, auto_increment으로 PK값을 넣어주는 경우)

strategy를 바꾸던지, Jdbc를 사용할 지를 결정해야 했는데, Bulk Insert만을 위해 strategy를 바꾸는 건 아닌거 같아서 Jdbc를 사용해보기로 했다.


내가 한 방법

spring.datasource.url = [DB URL]?rewriteBatchedStatements=true
  • JdbcTemplate으로 Bulk 연산을 위해서는 rewriteBatchedStatements 옵션을 활성화 해야 한다

@Repository
@RequiredArgsConstructor
public class ExampleBulkRepository {

    private final JdbcTemplate jdbcTemplate;

    public void saveAllByBulk(List<[저장할 엔티티]> example) {
        String sql = "INSERT INTO [저장할 엔티티] (필드1, 필드2, 필드3) " +
                "VALUES (?, ?, ?)";

        jdbcTemplate.batchUpdate(sql,
                [저장할 엔티티],
                [저장할 엔티티 사이즈],
                (PreparedStatement ps, [저장할 엔티티] ex) -> {
                    ex.setLong(1, ex.get필드1());
                    ex.setInt(2, ex.get필드2());
                    ex.setString(3, ex.get필드3());
                });
    }

}
  • JdbcTemplate의 batchUpdate 메소드 사용
    • 저장할 엔티티의 사이즈만큼 한번에 묶어서 Insert 쿼리를 날린다.
    • 컬럼별 자료형에 맞게 set을 해주면 된다
profile
하나씩 차근차근

0개의 댓글