Spring Boot MySQL rewriteBatchedStatements

TMT

hikari.data-source-properties.rewriteBatchedStatements: trueHikariCP 연결 풀에서 MySQL JDBC 드라이버의 배치 처리 성능을 최적화하기 위한 설정을 의미합니다. 이 설정은 MySQL 데이터베이스에 대량의 INSERT/UPDATE/DELETE 작업을 효율적으로 실행할 수 있도록 도와주며, 구체적인 의미와 동작 방식은 다음과 같습니다.

기본값은 false입니다.


1. 기능 목적

  • 배치 SQL 재작성: MySQL JDBC 드라이버는 기본적으로 executeBatch() 메서드를 호출해도 개별 SQL 문을 하나씩 전송합니다. rewriteBatchedStatements=true를 설정하면, 드라이버가 여러 배치 작업을 단일 SQL 문으로 재구성하여 네트워크 통신 오버헤드를 줄이고 실행 속도를 향상시킵니다.
    예시:
    -- 재작성 전
    INSERT INTO table VALUES (1, 'a');
    INSERT INTO table VALUES (2, 'b');
    
    -- 재작성 후
    INSERT INTO table VALUES (1, 'a'), (2, 'b');

2. 적용 범위

  • 지원 작업: INSERT, UPDATE, DELETE 문 모두에 적용 가능하지만, INSERT에서 가장 효과적입니다.
  • 드라이버 버전: MySQL Connector/J 5.1.13 이상에서 정상 동작하며, 일부 하위 버전(예: 5.1.12)에서도 작동할 수 있으나 공식 문서에서는 5.1.13+를 권장합니다.

3. HikariCP에서의 설정 의미

  • URL 파라미터 대체: 일반적으로 JDBC URL에 rewriteBatchedStatements=true를 추가하지만, HikariCP의 data-source-properties를 통해 별도로 설정할 수 있습니다. 이는 연결 풀 구성에서 유연성을 제공합니다.
    예시 (Spring Boot 설정):
    spring:
      datasource:
        hikari:
          data-source-properties:
            rewriteBatchedStatements: true

4. 성능 영향

  • 실험 결과:
    • 50만 건 데이터 삽입 시 33초 → 2초로 15배 이상 향상.
    • 1만 건 기준 JDBC 배치 1.1초, MyBatis 배치 2.2초로 기존 방식(5초) 대비 효율적.
  • 주의사항:
    • 데이터 일관성: 배치로 묶인 SQL 문의 구조가 일관되어야 재작성됩니다. 예를 들어, 다른 컬럼을 업데이트하는 SQL은 병합되지 않습니다.
    • 패킷 크기 제한: 재작성된 SQL이 max_allowed_packet(기본 4MB)을 초과하면 오류가 발생할 수 있으므로, MySQL 서버 설정 조정이 필요합니다.

5. 활용 시나리오

  • 대량 데이터 처리: 로그 저장, 배치 잡, CSV 임포트 등에서 유용합니다.
  • ORM 프레임워크: MyBatis, JPA(Hibernate)에서 saveBatch() 또는 addBatch() 메서드 사용 시 성능 개선 효과가 큽니다.
  • 주의할 예외: allowMultiQueries=true와 함께 사용할 경우, SQL 구문 오류가 발생할 수 있으므로 주의가 필요합니다.

성능 vs. 안정성:

  • 장점: 대량 데이터 처리 시 5~20배 성능 향상 (벤치마크).
  • 주의: 재작성된 쿼리가 너무 길면 max_allowed_packet 오류 발생 가능 → MySQL 서버 설정 조정 필요.

PostgreSQL

  • 옵션: reWriteBatchedInserts=true
  • 동작: MySQL과 유사하게 배치 INSERT 문을 VALUES (...), (...) 형식으로 재작성하지만, UPDATE/DELETE에는 적용되지 않습니다.
  • 성능: 기본 배치 모드보다 3~5배 빠릅니다.

공식 문서에서 권장하는 옵션입니다.

Oracle

  • 옵션: 별도의 재작성 옵션이 없습니다.
  • 동작: Oracle JDBC 드라이버는 기본적으로 배치 작업을 최적화합니다.
  • PreparedStatement.addBatch() → executeBatch() 호출 시 자동으로 배열 바인딩(Array Binding)을 사용합니다.
  • 성능: MySQL의 rewriteBatchedStatements와 유사한 성능을 보이지만, 별도 설정이 필요하지 않습니다.

SQL Server

  • 옵션: useBulkCopyForBatchInsert=true (Microsoft JDBC 드라이버 8.4+)
  • 동작: 대량 삽입 시 SQL Server의 Bulk Copy API를 사용하여 성능을 향상시킵니다.
  • 성능: 일반 배치 대비 5~10배 빠릅니다.

기타

  • MariaDB: MySQL Connector/J와 호환되므로 rewriteBatchedStatements=true를 동일하게 사용합니다.
  • SQLite: 별도의 배치 재작성 옵션이 없으며, 트랜잭션으로 묶는 것이 일반적인 최적화 방법입니다.
  • H2: OPTIMIZE_INSERT_FOR_BULK_LOAD=true 옵션으로 유사한 최적화를 할 수 있습니다.

요약

이 설정은 HikariCP를 통해 MySQL 배치 작업을 최적화하는 핵심 옵션으로, 대량 데이터 처리 시 성능을 극대화합니다. 다만 드라이버 버전, SQL 일관성, 패킷 크기 등을 고려하여 적용해야 합니다.

Edit this page

On this Page