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
'JPA' 카테고리의 다른 글
다양한 연관관계 매핑과 설정에 따른 트레이드 오프 (0) | 2021.12.31 |
---|---|
테이블과 컬럼에 대한 명세를 엔티티에 자세하게 적는것이 좋은지? (0) | 2021.12.29 |
기본키 매핑 전략에 따른 INSERT QUERY 실행 시점 (0) | 2021.12.28 |
EntityManager 를 쓰레드간 공유하면 안되는 이유 (0) | 2021.12.28 |
JPA 는 과연 1차 캐시를 통해서 Repeatable Read 를 지원할까? (0) | 2021.12.27 |