2011-08-03 3 views
1

저는 ehcache를 처음 사용하기 때문에 내가 필요한 것을 정확하게 찾을 수없는 것 같습니다.ehcache 안에 정렬 된 목록을 저장합니다.

나는 최대 절전 모드를 사용하고 있으며 빠른 쿼리가 필요한 하나의 큰 테이블 (500k + 항목)을 가지고있다.

사용자는 페이지에서이 테이블을 4 가지 다른 속성으로 정렬하여 되돌아 가야합니다. 필자는이 테이블을 미리 정렬하고 4 개의 다른 캐시 된 목록에 저장하도록했습니다. 또한 사용자는이 테이블을 통해 검색 할 수 있습니다.

어떻게하면됩니까? 데이터를 미리 가져 와서 데이터베이스에서 자동으로 업데이트하고 싶습니다.

답변

0

흥미로운 질문이지만, 실제로 최대 절전 모드는 당신이 필요로하는 모든 것을 제공하지만, 기계는 조금 복잡합니다. 우선, 2 차 레벨 캐시 (L2)가 필요합니다. id로 각 레코드를 단일 항목으로 저장합니다. 즉, 데이터베이스를 건드리지 않고 id로 개체를 쉽게 쿼리 할 수 ​​있습니다.

이것만으로는 도움이되지 않으며 쿼리 캐시이 등장합니다. (목록을

SELECT c1, c2, c3, c4 
FROM table 
ORDER BY c1 ASC 
LIMIT 100,20 

이 쿼리를 실행 처음으로, Hibernate는 데이터베이스에 대해이 실행되지만 그것은 또한 L2의 모든 반환 된 레코드를 저장하고 그 결과 자체를 저장합니다 :이 유사한 쿼리가 있다고 가정 ids)를 쿼리 캐시에 저장합니다. 다음 번에 똑같은 질의를 실행하면 Hibernate는 질의 캐시에있는 id의 목록을 찾은 다음 L2에서 차례로 각 레코드를 가져온다.

약간 다른 쿼리를 사용하면 Hibernate는 SQL을 실행하고 결과를 다른 키로 저장합니다. 쿼리 캐시에 별도의 캐시를 사용하고 쿼리와 모든 매개 변수를 연결하여 키를 만듭니다.

Hibernate가 캐시에 전체 결과를 저장하고 메모리에 페이징을 적용 할 것인지, 아니면 단일 페이지를 별도로 저장할 것인지 여부는 확실하지 않으므로 각 쿼리에는 많은 고유 페이지가있을 수있는만큼 캐시의 요소가 많이 포함됩니다. 이 길로 가면, 당신이 나를 계몽 할 수 있다면 좋을 것입니다.

또한 어떤 수정이 모든 캐시는이 표를 포함하는 조회한다 무효화 최대 절전 모드를 통해이 표에 어떤 행을 이루어 있습니다. BTW 500K는 그렇게 큰 테이블이 아닙니다 ;-). 각 레코드가 1KiB를 차지하면 전체 데이터베이스를 메모리에 보관하는 것이 좋습니다.

+0

저는 ehcache를 통해 두 번째 레벨 캐시를 가지고 놀았으며 필요한 성능을 제공하지 못했습니다. 각 사용자에 대한 쿼리 자체는 다릅니다. 데이터는 읽기 전용도 아닙니다. 하루에 1-2 번 업데이트됩니다. 첫 번째 히트가 느려지 길 원치 않기 때문에 데이터를 미리 가져 오려고합니다. – kgibbon

0

500K 레코드는 어떤 방식 으로든 큰 테이블이 아닙니다.

데이터베이스 및 기본 OS를 적절하게 구성하여 테이블 및 필요한 인덱스가 캐시 DB쪽에 들어가고 유지되도록함으로써 최대 성능을 얻을 수 있습니다.

Hibernate의 2 차 레벨 캐시 + 질의 캐시는 특히 다양한 방법으로 페이지 매김되고 정렬되어야하는 가변적 인 데이터를 가지고 여기서 도움이되지는 않을 것입니다.

+0

정보 주셔서 감사합니다. 이 테이블은 2 ~ 3 백만 건의 레코드로 성장할 것입니다. 이 테이블에는 동시에 두 개의 관계가 있다는 것을 언급하겠습니다. 그래서 당신의 말은 항목의 큰 컬렉션을 정렬에서 최대 성능은 DB쪽에 될거야?데이터를 미리 가져 와서 두 번째 수준의 캐시에 저장하면됩니다. – kgibbon

+0

@kgibbon 쿼리 캐시를 사용하면 거의 변경되지 않는 데이터에 사용되는 특정 쿼리에 대해 의미가 있습니다. 2 ~ 3 백만 건의 레코드 (페이지가 매겨진 + 4 가지 방식으로 정렬 됨)에서는 쿼리 캐시에서이를 수행하는 데 상당한 오버 헤드 (메모리 및 성능 측면)가 있습니다. 그리고 그 중 일부는 삭제 될 때마다/변경 될 때마다 다시 가져와야합니다. – ChssPly76

+0

내 최선의 방법은 무엇일까요? 임 포스트그레스를 사용합니다. 필자는 db 용 8GB 머신을 가지고 있으며 아직 튜닝을하지 않았습니다. 그게 내 최선의 방법이라고 생각하니? 그것은 캐싱과 정렬을 수행하는 db까지 보냅니 까? – kgibbon

관련 문제