Batch Insert란?
batch insert는 여러 개의 SQL Statement를 하나의 구문으로 처리하는 것을 말한다. batch insert는 jdbc batch 기능이고, hibernate에서 write-behind(쓰기 지연)를 통해 처리한다. 여러 개의 구문을 합쳐 하나로 보내기 때문에 성능 개선을 할 수 있다. JPA는 트랜잭션이 commit 되는 순간 한꺼번에 flush가 이뤄진다.
사용방법
application.yml
파일을 아래와 같이 설정한다.
spring:
jpa:
database: mysql
properties:
hibernate.jdbc.batch_size: 50
hibernate.order_inserts: true
hibernate.order_updates: true
hibernate.dialect: org.hibernate.dialect.~~~
hibernate.show_sql: true
datasource:
url: jdbc:~~://localhost:{port}/~~?&rewriteBatchedStatements=true
driver-class-name: com.~~.jdbc.Driver
batch_size
: 한 번의 트랜잭션에서 다룰 size 지정order_inserts
: 데이터 일괄 입력시 사용 (default = false)order_updates
: 데이터 일괄 수정시 사용 (default = false)rewriteBatchedStatements
: batch 쿼리가 재구성 되어 성능향상이 일어남
Batch Insert 사용시 주의사항
Entity Key 생성을 GenerationType.IDENTITY로 하면 batch 옵션이 동작하지 않는다. IDENTITY 옵션은 쿼리가 수행된 이후에 값을 얻을 수 있기 때문이다. 다르게 말해 Entity를 persist 하기 위해서 @Id로 지정한 필드에 값이 필요한데 IDENTITY(auto_increment) 타입은 실제 DB에 insert를 해야만 값을 얻을 수 있기 때문에 batch 처리가 불가능하다.
Batch Insert를 사용하는 이유
주요 이유는 성능 향상을 위함이다. 일반적으로 Hibernate는 각각의 SQL 쿼리를 실행하기 위해 많은 시간을 소비한다. 이는 네트워크 비용, 데이터베이스 트랜잭션 비용 등을 포함하여 많은 오버헤드를 초래할 수 있다. 따라서 Batch Insert를 사용하여 한 번의 데이터베이스 트랜잭션에서 여러 개의 SQL 쿼리를 실행하면 이러한 오버헤드를 크게 줄일 수 있다. 이는 특히 대량의 데이터를 데이터베이스에 삽입할 때 매우 유용하다.
성능 비교
bulk insert를 사용했을 때와 사용하지 않았을 때, 데이터의 양이 많아 지는 경우 최대 40~50배의 성능 차이가 나는 것을 확인할 수 있다.
10건 | 100건 | 1000건 | 10000건 | 100000건 | |
JPA | 0.03s | 0.19s | 2.06s | 18.47s | 175.58s |
jdbc | 0.01s | 0.01s | 0.09s | 0.33s | 4.31s |
차이 | 3배 | 19배 | 22배 | 55.96배 | 40.73배 |
https://velog.io/@backtony/JPA-Batch-Insert와-JDBC-Batch-Insert
https://velog.io/@dongvelop/Spring-Data-JPA-Batch-Insert로-한번에-데이터-삽입하기
https://sabarada.tistory.com/220
'Backend > JPA' 카테고리의 다른 글
[JPA] EntityManagerFactory VS EntityManager (1) | 2024.01.12 |
---|---|
[JPA] FetchType.Lazy로 설정한 엔터티 조회시 N+1 문제 해결 방법 (0) | 2024.01.10 |
[JPA] OneToMany, ManyToOne에서 어떤 Fetch Type을 사용해야 할까? (1) | 2024.01.08 |