특정 시간에 데이터를 저장할 일이 생겼다.
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
@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());
});
}
}