기록하는 습관

[Research] MySQL Batch Insert 본문

개발/Research

[Research] MySQL Batch Insert

로그뉴 2022. 7. 12. 16:49

batch insert

insert rows 여러 개 연결해서 한 번에 입력하는 것을 Batch Insert라고 한다. Batch Insert는 하나의 트랜잭션으로 묶이게 된다.

 

batch insert with jpa

쓰기 지연

  • 엔티티 매니저는 트랜잭션을 커밋 하기 직전까지 데이터베이스에 엔티티를 저장하지 않고 내부 쿼리 저장소에 INSERT SQL을 모아둔다.
  • 그리고 트랜잭션을 커밋 할 때 모아둔 쿼리를 데이터베이스에 보내는데 이것을 트랜잭션을 지원하는 쓰기 지연이라 한다.

 

옵션 설정

  • rewriteBatchedStatements=true
    • 해당 속성이 있어야 batch insert 동작
    • MySQL Connector/J 8.0 Developer Guide : 6.3.13 Performance Extensions
      Stops checking if every INSERT statement contains the “ON DUPLICATE KEY UPDATE” clause. As a side effect, obtaining the statement’s generated keys information will return a list where normally it wouldn’t. Also be aware that, in this case, the list of generated keys returned may not be accurate. The effect of this property is canceled if set simultaneously with ‘rewriteBatchedStatements=true’.
  • hibernate.jdbc.batch_size: 50
    • Batch Insert의 size 지정
    • Hibernate User Guide: 12.2.1. Batch inserts
    • When you make new objects persistent, employ methods flush() and clear() to the session regularly, to control the size of the first-level cache.

 

 

batch size를 지정해야 하는 이유

  • batchSize 값을 기준으로 flush();, clear();를 이용해서 영속성 컨텍스트를 초기화 작업을 진행하고 있음.
  • batchSize에 대한 제한이 없으면 영속성 컨텍스트에 모든 엔티티가 올라가기 때문에 OutOfMemoryException 발생할 수 있고, 메모리 관리 측면에서도 효율적이지 않기 때문.
  • Hibernate User Guide: 12.2. Session batching
    1. Hibernate caches all the newly inserted Customer instances in the session-level cache, so, when the transaction ends, 100 000 entities are managed by the persistence context. If the maximum memory allocated to the JVM is rather low, this example could fail with an OutOfMemoryException. The Java 1.8 JVM allocated either 1/4 of available RAM or 1Gb, which can easily accommodate 100 000 objects on the heap.
    2. long-running transactions can deplete a connection pool so other transactions don’t get a chance to proceed
    3. JDBC batching is not enabled by default, so every insert statement requires a database roundtrip. To enable JDBC batching, set the hibernate.jdbc.batch_size property to an integer between 10 and 50.

 

 

JPA batch insert의 한계

@GeneratedValue(strategy = GenerationType.IDENTITY) 방식의 경우 Batch Insert를 지원하지 않음.

 

 

Spring Data JDBC vs JPA

 

참고: https://cheese10yun.github.io/jpa-batch-insert/

'개발 > Research' 카테고리의 다른 글

[Research] Redis 캐싱 전략  (0) 2022.07.13
[Research] Redis 조사  (0) 2022.07.12
[Research] Springfox Swagger2 -> Springdoc OpenAPI 3  (0) 2022.07.12
tomcat vs. hikaricp  (0) 2022.07.12
배치, 스케줄러  (0) 2022.07.12
Comments