JPA

AllocationSize 를 통한 성능 최적화

DeJa 2021. 12. 28. 21:41
728x90

AllocationSize 를 통한 성능 최적화

TABLE 이나 SEQUENCE 전략을 사용할 때, @SequenceGenerator 에 allocationsize 옵션을 설정하여 INSERT 에 관한 성능 최적화를 할 수 있다. allocationsize 의 기본값은 50인데 왜 50으로 설정이 되었을지 테스트를 통해서 배워보자.

Test

@SequenceGenerator(
        name = "MEMBER_SEQ_GENERATOR",
        sequenceName = "MEMBER_SEQ",
        initialValue = 1, allocationSize = 50)
@NoArgsConstructor
@Getter @Setter
@Entity
public class Member {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "MEMBER_SEQ_GENERATOR")
    private Long id;

    @Column(name = "name")
    private String username;
}
@DisplayName("AllocationSize 테스트")
@SpringBootTest
class AllocationSizeTest {

    @Value("${persistence.unitname}")
    private String persistenceUnitName;

    @DisplayName("AllocationSize 를 통한 성능 최적화")
    @Test
    void optimizeByAllocationSize() throws Exception {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory(persistenceUnitName);
        EntityManager em = emf.createEntityManager();
        EntityTransaction tx = em.getTransaction();

        tx.begin();
        try {
            Member member = new Member();
            member.setUsername("BAEK");

            // 처음 호출할 때는 값이 1이다. 하지만 설정값이 50으로 되어있기 때문에
            // 한번더 호출하여 SEQ 를 1에서 51로 변경시킨다.
            em.persist(member); // DB Sequence Call : 1, 51
            em.persist(member); // Memory Call
            em.persist(member); // Memory Call
            em.persist(member); // Memory Call

            tx.commit();
        } catch (Exception e) {
            tx.rollback();
        } finally {
            em.close();
            emf.close();
        }
    }
}

애플리케이션 실행 시 아래와 같은 메시지를 볼 수 있다.

Hibernate: create sequence MEMBER_SEQ start with 1 increment by 50

그리고 em.persist(member) 를 처음 호출하는 경우 아래와 같은 메시지를 볼 수 있다.

Hibernate: 
    call next value for MEMBER_SEQ
Hibernate: 
    call next value for MEMBER_SEQ

2번째 부터 5번째의 em.persist(member)에 대해서는 DB 에서 시퀀스 값을 가져오는 것이 아니라, 메모리에 저장되어 있는 시퀀스 값을 가져와서 사용하기 때문에 성능상 이점이 발생한다.

Web Server 가 여러대가 동시에 호출하더라도, 메모리에 값을 쭉 올려놓고 가져와서 사용하는 방식이기 때문에 동시성 문제는 없다고 한다.

728x90