2017-12-07 13 views
0

우리는 500,000 개의 하위 개체 모음이있는 상위 개체가 있습니다. 우리는 ehcache를 캐시 제공자로 매핑하기 위해 Hibernate를 사용하고있다. 엔티티와 콜렉션에 2 차 레벨 캐시를 사용하면 데이터베이스에 대한 요청을 피할 수 있으므로 잘 작동합니다.2 차 레벨 캐시 사용에도 불구하고 큰 컬렉션의 성능 문제를 해결하십시오

그러나 2 차 수준 캐시로 500,000 개의 개체를로드하면 여전히 많은 CPU 및 메모리 가비지가 생성되어 몇 초의 응답 시간이 소요됩니다. 자식 객체는 불변하지 않기 때문에 우리는 hibernate.cache.use_reference_entries 속성을 활성화 할 수 없다.

최대 절전 모드 2 수준 캐시 상단에 dao 개체의 응용 프로그램 계층 캐시를 사용하면 CPU 및 가비지 메모리 오버 헤드가 없습니다. 응답 시간은 초 단위가 아닌 몇 밀리 초입니다.

그러나이 솔루션의 가장 큰 단점은이 캐시를 직접 관리해야한다는 것입니다. 클러스터 된 멀티 스레딩 시스템에 무효화 및 동기화 포함

저의 CPU와 쓰레기의 장점이있는 더 나은 솔루션이 있다면 제 질문은 무엇입니까? 대형 컬렉션을 다룰 때 경험이있는 사람이 있습니까?

답변

0

정말 한 번에 500k가 필요합니까?

부모로부터 컬렉션을 제거하고 부모로부터 자식의 개체를 쿼리 할 수 ​​있습니다 : SELECT c FROM Child c WHERE c.parent = :parent 그리고 한 번에 500k를 필요로하지 않을 때 페이지 매김이나 필터링을 추가 할 수 있습니다.

메모리 엔티티를 DTO로로드하여 메모리 성능을 향상시킬 수도 있습니다. 왜냐하면 최대 절전 모드는 더티 검사를 위해이 DTO를 고려하지 않기 때문입니다. 나는 벤치마킹을하지는 않았지만 이것은 메모리 사용량을 반으로 줄이는 것이라고 생각합니다. 또한 DTO를 사용하면 메모리와 CPU를 절약하는 특정 유스 케이스에서 필요하지 않은 속성을 생략 할 수 있습니다.

최대 절전 모드 5에서 enableDirtyTracking을 볼 수도 있습니다.