728x90
jpa 를 사용해서 대량 insert 를 해야할 일이 생겼다. 사실 딱히 대량까진 아니고 많아봐야 1,000건이란 제한이 있는 데이터였다. 그런데 이게 10초가 넘게 걸렸다. jpa에서 대량 insert 시 사용하라고 하는 saveAll 을 사용하는데도 그랬다.
mybatis 환경이라면 쿼리로 insert all 를 작성해서 사용했을 것이고 이 경우 insert 하는 데이터가 1만건이 넘어가더라도 10초가 걸리진 않는다.
JPA에서 saveAll 로 배치 insert 하려면 application.yml 파일에 아래 설정이 추가로 필요하다.
spring.jpa.properties.hibernate.jdbc.batch_size=1000
spring.jpa.properties.hibernate.order_inserts=true
spring.jpa.properties.hibernate.order_updates=true
그런데 문제는 이게 @GeneratedValue(strategy = GenerationType.IDENTITY) 와 같이 PK를 AUTO_INCREMENT 로 생성하는 환경에서는 동작하지 않는다. 안되는 이유는 서칭하면 많이 나오니 여기에서는 생략한다. 아무튼 대부분 AUTO_INCREMENT 로 PK를 구성할 것이기 때문에 이는 타격이 크다.
이런 이유로 JPA 에서 대량 insert 를 해야 하는 상황이라면 대부분 JdbcTemplate 의 batchUpdate 를 사용한다. spring-boot -starter-data-jpa 의존성에 기본적으로 포함되어 있기도 하고 mybatis 를 추가로 연동해서 사용해도 되지만 대부분 insert 하나 때문에 추가로 구성하진 않는 걸로 보인다.
코틀린 기반 구성방법은 추후 다시 정리...
https://kapentaz.github.io/jpa/JPA-Batch-Insert-with-MySQL/#
https://jojoldu.tistory.com/558
https://velog.io/@rainmaker007/spring-data-jpa-batch-insert-정리
https://wave1994.tistory.com/160
https://homoefficio.github.io/2020/01/25/Spring-Data에서-Batch-Insert-최적화/
https://mkyong.com/spring/spring-jdbctemplate-batchupdate-example/
https://godekdls.github.io/Spring%20Data%20Access/dataaccesswithjdbc/
https://pepperoni.netlify.app/batch-insert/
https://heowc.dev/2019/02/12/using-mysql-jdbc-to-handle-large-table-2/
https://ohgym.tistory.com/48
728x90
'Backend > JPA' 카테고리의 다른 글
No serializer found for class org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (0) | 2022.02.14 |
---|---|
[JPA] querydsl 정리 (0) | 2022.01.03 |
[JPA] 코틀린+JPA (0) | 2021.12.24 |
[JPA] 연관관계 매핑 (0) | 2021.12.17 |
[JPA] EntityManager (0) | 2021.12.08 |