JPA를 사용하여 데이터베이스에서 엔티티를 가져옵니다. 엔터티에는 부모-자식 관계가 있으며 전체 계층 구조를 가져오고 싶습니다. 그래서 모든 루트 노드 (부모가없는 엔터티)를 가져온 다음 이러한 노드를 반복적으로 반복하여 계층 전체를 가져옵니다.
모든 노드를 가져 오지만 거의 12 분 이상 걸립니다. 테이블에는 총 5500 개의 행이 있습니다.
좋은 성능인지 아니면 개선해야하는지 알고 싶습니다.
내가 올바르게 이해하면 전체 테이블을로드하는 것입니다. 연결 초기화를 트리거하기 위해 방문자와 함께 루트를 가져오고 계층 구조에 깊이 빠져들기만하면됩니다. 이렇게하면 계층 구조의 일부만 가져 오는 개별 select 문이 많이 생성되고 앱에서 데이터베이스까지의 지연 시간에 발급 된 문 수를 곱합니다.
이 경우 부모에서 자식으로 LEFT JOIN FETCH
의 OneToMany
연결을 선택하여 전체 테이블을 가져올 수 있습니다 . 이렇게하면 데이터베이스와의 단 한 번의 왕복으로 전체 계층 구조가로드됩니다.
HierarchyElement
엔티티 클래스라고 가정하면 다음 JPA 쿼리에서 부모에 대한 참조가되는 HierarchyElement.children
요소의 자식 HierarchyElement.parent
에 대한 컬렉션입니다.
select he from HierarchyElement he where he.parent is null
방문자가 요소를 반복하고 HierarchyElement.children
컬렉션을 재귀 적으로 초기화하는 것은 다음 보다 훨씬 느립니다.
select he from HierarchyElement he left join fetch he.children
이 후자의 쿼리를 사용하면 컬렉션 HierarchyElement
과 함께로드 된 HierarchyElement.children
모든 것이 초기화됩니다. 그리고 전체 테이블을로드하기 HierarchyElement.parent
때문에 parent
연결이로 표시되어 있어도 가능한 모든 관계가 적절한 엔터티를 올바르게 가리키게 됩니다 LAZY
. JPA 공급자가 사용자를 위해 엔터티를 빌드 할 때 모든 엔터티가 첫 번째 캐시에 있고 JPA 공급자가 연결할 엔터티를 알 수 있기 때문입니다.
위의 내용을 사용하면 가져온 모든 요소를 쉽게 살펴보고 계층 루트 인 부모가 null 인 요소 만 가져올 수 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다