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