티스토리 뷰

문제 상황

JPA의 saveAll()을 이용하여 600건의 데이터를 저장하는 기능을 만들었다. 실제 결과는 300건만 저장되고 있었다.

 

원인

JDBC 기본 배치 크기는 따로 설정하지 않은 경우 한번에 처리될 수 있는 개수가 제한되어 있음

 

해결

방법1 - 배치 크기 설정

application.properties에 설정을 통해 배치 크기를 조정할 수 있다.

단, 키 생성 전략으로 IDENTITY 방식을 사용하면 사용할 수 없다. 영속성 컨텍스트 내부에서 엔티티 식별을 위해 PK값을 사용하는데 IDENTITY 방식은 DB에 INSERT한 후에 PK 확인이 가능하기 때문이다.

spring.jpa.properties.hibernate.jdbc.batch_size=2000
spring.jpa.properties.hibernate.order_inserts=true

 

 

방법2 - jdbcTemplate의 batchUpdate() 사용

@Repository
class ExampleRepository(private val jdbcTemplate: JdbcTemplate) {
    fun saveAll(examples: List<Example>) {
        val sql = "INSERT INTO TEST (COLUMN1, COLUMN2, COLUMN3) VALUES (?, ?, ?)"
        val batchArgs = examples.map { example ->
            arrayOf(example.colum1, drawing.colum2, drawing.colum3)
        }
        jdbcTemplate.batchUpdate(sql, batchArgs)
    }
}

 

댓글
Total
Today
Yesterday
링크
Apple 2023 맥북 프로 14 M3, 스페이스 그레이, M3 8코어, 10코어 GPU, 512GB, 8GB, 한글