hibernate
성능 튜닝
수색…
EAGER 가져 오기 유형 사용 안함
Hibernate는 두 엔티티, EAGER
와 LAZY
사이의 관계를 매핑 할 때 두 가지 유형의 가져 오기를 사용할 수 있습니다.
일반적으로 EAGER
가져 오기 유형은 JPA에이 데이터가 필요하지 않은 경우에도 항상 데이터를 가져 오도록 지시하기 때문에 좋은 생각이 아닙니다.
예를 들어 Person
엔티티가 있고 Address
와의 관계가 다음과 같은 경우 :
@Entity
public class Person {
@OneToMany(mappedBy="address", fetch=FetchType.EAGER)
private List<Address> addresses;
}
쿼리 언제든지 Person
의 목록 Address
이의 Person
도 반환됩니다.
따라서 엔티티를 다음과 매핑하는 대신
@ManyToMany(mappedBy="address", fetch=FetchType.EAGER)
용도:
@ManyToMany(mappedBy="address", fetch=FetchType.LAZY)
주의해야 할 또 하나의 관계는 @OneToOne
과 @ManyToOne
입니다. 둘 다 기본적으로 EAGER입니다. 따라서 응용 프로그램의 성능에 관심이있는 경우이 유형의 관계에 대한 반입을 설정해야합니다.
@ManyToOne(fetch=FetchType.LAZY)
과:
@OneToOne(fetch=FetchType.LAZY)
상속 대신 컴포지션 사용
Hibernate는 상속 전략을 가지고있다. JOINED
상속 유형은 하위 엔티티와 상위 엔티티 사이에 JOIN을 수행합니다.
이 접근법의 문제점은 Hibernate가 상속에 관련된 모든 테이블의 데이터를 항상 가져 오는 것이다.
예를 들어 JOINED
상속 유형을 사용하는 Bicycle
및 MountainBike
엔티티가있는 경우 :
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class Bicycle {
}
과:
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class MountainBike extends Bicycle {
}
MountainBike
를 친 JPQL 쿼리는 Bicycle
데이터를 가져와 다음과 같은 SQL 쿼리를 생성합니다.
select mb.*, b.* from MountainBike mb JOIN Bicycle b ON b.id = mb.id WHERE ...
Bicycle
대한 다른 부모 (예 : Transport
과 같이)가있는 경우이 위 쿼리는이 부모로부터 데이터를 가져 와서 추가 JOIN을 수행합니다.
보시다시피, 이것은 일종의 EAGER
매핑입니다. 이 상속 전략을 사용하여 MountainBike
테이블의 데이터 만 가져올 수있는 선택권이 없습니다.
성능을위한 최선의 방법은 상속 대신 컴포지션 사용입니다.
이를 달성하기 위해 MountainBike
엔티티를 필드 bicycle
로 매핑 할 수 있습니다.
@Entity
public class MountainBike {
@OneToOne(fetchType = FetchType.LAZY)
private Bicycle bicycle;
}
그리고 Bicycle
:
@Entity
public class Bicycle {
}
모든 쿼리는 기본적으로 MountainBike
데이터 만 가져옵니다.