WSJPA FastPath 구성
JPA(Java™ Persistence API)는 구현자가 Java 오브젝트 양식으로 관계형 데이터를 변환하는 방법에 대한 가이드라인을 제공하는 매우 유연한 스펙입니다. API의 유연한 네이처로 인해 많은 작업이 관계형 데이터를 오브젝트 양식으로 올바르게 로드하는 방법을 판별하기 위해 API 제공자에 의해 런타임에 완료됩니다. 특정 상황에서, 이러한 유연성으로 인해 데이터가 올바르게 로드되도록 런타임에 여분의 코드를 계속해서 실행해야 합니다. 일부 이러한 유연성을 포기하여, WSJPA FastPath 최적화는 이러한 여분의 코드의 많은 부분을 건너뛰어 JDBC 계층과 직접 상호작용하는 고도로 최적화된 코드의 생성을 시도합니다. 이 최적화를 통해 향상된 성능을 얻을 수 있습니다.
이 태스크 정보
이러한 코드 경로 최적화는 복잡한 프로세스이므로, 모든 도메인 모델이 WSJPA FastPath 최적화의 요구사항을 만족시키지는 않습니다.
Fastpath 기능은 데이터가 허용 가능한 형식으로 모델링되어 있고 확장 JPA 기능을 사용하지 않는 일부 애플리케이션의 성능을 향상시킬 수 있습니다.
public Customer findCustomer(int id) {
return em.find(Customer.class, id);
}
이 예는 고객 엔티티를 찾는 단순한 헬퍼 메소드입니다. findCustomer 메소드가 시작될 때마다, JPA 런타임은 많은 코드를 실행하여 요청을 분석하고, 데이터베이스에 액세스하고 고객 엔티티를 로드합니다. FastPath 최적화를 사용하지 않으면, 대부분의 논리가 findCustomer 메소드의 두 번째 및 후속 실행의 경우와 동일합니다. 첫 번째 실행의 런타임 의사결정 중 극히 일부만 findCustomer 메소드의 향후 호출을 위해 보유됩니다. 이러한 여분의 코드 처리는 일부 시나리오에서 성능 문제를 야기할 수 있습니다.
10855 fp_pu INFO [main] FP - Successfully generated FastPath com.ibm.ws.persistence.fastpath.entities.Customer$Find$FastPath@1f6b69d7".
이 메시지가 로깅되면 고객을 발견하는 모든 향후 실행은 새로 생성된 이 경로를 사용합니다.
이전 예는 파인더 경로가 실행되는 방법을 간단하게 보여주었습니다. FastPath는 또한 필드(관계 및 비관계)의 지연 로딩과 NamedQueries 실행을 최적화하려고 시도합니다.
FastPath 구성:
지속성 단위 특성 wsjpa.FastPath=true가 설정되는 경우, JPA 런타임은 어느 조작이 안전하게 처리될 수 있는지 판별하려고 합니다. Include 및 Exclude 특성을 사용하여 어느 조작이 FastPath를 사용하여 실행되는지 명시적으로 구성할 수 있습니다.
<property name=”openjpa.MetaDataRepository” value=”Preload=true”/>
<property name=”wsjpa.FastPath”
value=”true(Include=’<path>;,<path>;...’;Exclude=’<path>,<path>...’)”>
- 파인더: <Fully qualified Entity name>(예: com.ibm.ws.jpa.Customer)
- 지연 로드 필드: <Fully qualified field name> (예: com.ibm.ws.jpa.Customer.cars)
- 이름 지정된 조회: <Full query name> (예: com.ibm.ws.jpa.customer_find_by_id)
- 특성(Include/Exclude)이 지정되지 않으면, 런타임은 모든 지속적 유형을 스캔하여 처리 가능한 경로를 판별합니다.
- Include 특성이 지정되면, 지정된 경로만 처리되고 exclude 특성은 무시됩니다.
- exclude 특성이 지정되면, 제외 목록에 없는 모든 경로가 처리됩니다.
- 제외 목록에 필드가 제공되고, 필드의 페치 유형이 EAGER인 경우, 필드가 지연 로드되지 않으므로 필드가 무시됩니다.
<property name="wsjpa.FastPath" value="false"/>
이 예에서, false는 기본값입니다. 이 최적화는 기본적으로
켜지지 않습니다.<property name="wsjpa.FastPath" value="true"/>
런타임은 모든 엔티티를 처리하고, 최적화 할 수 있는 파인더, 지연 로드 조작, 이름 지정된 조회를
판별합니다.<property name="wsjpa.FastPath" value="true(Exclude=com.ibm.ws.jpa.entities.Customer.address,customer.findById"/>
예 #2의 경우와 동일하지만, Customer.address 필드 지연 로딩은 제외하고
이름 지정된 조회 customer.findById는 FastPath 처리에서 제외됩니다.<property name="wsjpa.FastPath" value="true(Include=com.ibm.ws.jpa.entities.Customer, customer.findById"/>
처리되는 유일한 조작은 고객을 찾고
NamedQuery ‘customer.findById’를 실행하는 것입니다. 다른 모든 조작은
일반 JPA 런타임을 사용하여 실행됩니다.제한사항:
- openjpa.DataCache 특성과 호환 불가능.
- openjpa.FetchPlan 특성과 호환 불가능.
- LockModeType 및/또는 특성 맵을 EntityManager 찾기 메소드로 전달.
- 사용자 정의 필드 전략
@org.apache.openjpa.persistence.Factory, @javax.persistence.SecondaryTable,
@org.apache.openjpa.persistence.Externalizer,
@org.apache.openjpa.persistence.ExternalValues,
@org.apache.openjpa.persistence.LRS, @java.sql.Lob, @java.sql.Clob, @java.sql.Blo- XML 열 맵핑
- 임베드 가능
- 단일 테이블 상속만 지원됨.
- @javax.persistence.PostLoad 콜백
- 구분된 ID
- 다음 결과의 경로 실행:
- ManyToMany 필드 페치.
- 맵 또는 배열로 구현된 콜렉션 페치.
- 결합 테이블에서 결합을 초래하는 SQL문 실행
- 둘 이상의 동일한 테이블에서 결합을 초래하는 SQL문 실행. 즉: 동일한 엔티티에 대한 여러 EAGER OneToOne 관계가 있는 엔티티.
- 다중 레벨의 eager 관계 로딩. 예: {A->(eager)B->(eager)C}
- NamedQuery에서 다음 메소드 setFirst, setFlush, setHind, setLockMode, setMax 호출.
- PureQuery를 사용하는 JPA 애플리케이션과 호환 불가능.
- 액세스 의도를 사용하는 JPA 애플리케이션과 호환 불가능.
- 런타임 시 JPA가 데이터를 페치하는 방법을 변경하는 모든 특성 설정.