티스토리 뷰
문제 상황
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)
}
}
'Framework > Spring Data JPA' 카테고리의 다른 글
우아한테크캠프 Pro 5기 - 도메인 이벤트 (0) | 2022.12.30 |
---|---|
우아한테크캠프 Pro 5기 - Spring Data JPA (0) | 2022.11.24 |
[JPA/Hibernate] 프록시와 연관관계 관리 (0) | 2021.06.29 |
[JPA/Hibernate] 고급 매핑 (0) | 2021.06.28 |
[JPA/Hibernate] 연관관계 매핑 기초 (0) | 2021.05.25 |
댓글