흥미로운 질문이지만, 실제로 최대 절전 모드는 당신이 필요로하는 모든 것을 제공하지만, 기계는 조금 복잡합니다. 우선, 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를 차지하면 전체 데이터베이스를 메모리에 보관하는 것이 좋습니다.
저는 ehcache를 통해 두 번째 레벨 캐시를 가지고 놀았으며 필요한 성능을 제공하지 못했습니다. 각 사용자에 대한 쿼리 자체는 다릅니다. 데이터는 읽기 전용도 아닙니다. 하루에 1-2 번 업데이트됩니다. 첫 번째 히트가 느려지 길 원치 않기 때문에 데이터를 미리 가져 오려고합니다. – kgibbon