[JPA] 쓰기 지연와 JDBC 의 배치

쓰기 지연과 JDBC 배치

  1. JDBC 배치 기능
    1. INSERT 시 마다 DB와 통신이 발생함.
    1. 네트워크 IO 비용이 있기에.. 성능에 부정적인 영향을 미친다.
    1. JDBC 배치로 SQL 명령을 한 번에 DB로 보내 성능을 극대화 할 수 있다.
  1. JPA 플러시 기능 활용
    1. JPA 는 내부적으로 플러시 기능으로 DB와 통신함.
    1. JPA 는 JDBC 의 SQL 배치 기능을 보다 효과적으로 사용이 가능하다.

하이버네이트의 설정

  • hibernate.jdbc.batch_size 속성을 50 으로 설정하면
    • 최대 50건의 데이터를 모아서 SQL 배치를 수행함

쓰기 지연의 작동 방식

  • 같은 종류의 SQL 명령을 모아서 배치 처리함.
em.persist(new Member()); // 1
em.persist(new Member()); // 2
em.persist(new Member()); // 3
em.persist(new Member()); // 4
em.persist(new Child());   // 5, 다른 연산
em.persist(new Member()); // 6
em.persist(new Member()); // 7
  • 1 2 3 4 번은 하나의 배치로 쿼리 발사
  • 5번 단독
  • 6 7 하나의 배치 쿼리로 발사

주의

  • IDENTITY 식별자 생성 전략 ( MYSQL 의 경우? )
    • persist() 호출시 즉시 INSERT SQL 이 수행된다고 함.
    • DB 저장해 식별자를 구할 수 있기 때문…
    • 해당 경우에는 쓰기 지연을 통한 성능 최적화는 불가능
    • MYSQL은 SEQUENCE를 지원하지 않기에…
      • TABLE 전략을 써야한다는데,, 솔직히 사용하는 경우가 있나 싶다.

    그냥 JDBC 를 사용해서 배치 쿼리를 최적화하는게 맞지않나 싶다


Uploaded by N2T