2017-01-24 1 views
3

우리는 Hazelcast 3.6.1과 함께 Hibernate 3.5.6을 2 차 캐시로 사용하고 있습니다. 우리에게는 다음과 같은 문제가 있습니다. 우리는 non-lazy collection을 가진 Hibernate 엔티티를 가지고있다. 동일한 노드에서 두 개의 연속 된 세션으로 컬렉션에 요소를 추가하면 전체 컬렉션이 항상 데이터베이스에서 다시로드됩니다. 나는 요소가 컬렉션에서 완전히 제거되지 않고 캐시에서 제거되어 다른 항목을 추가 할 때마다 다시로드 될 때 2 차 레벨 캐시를 업데이트 할 수있을 것으로 기대했을 것입니다. 이것은 Hibernate 2 차 레벨 캐시의 주된 문제인가, 아니면 이것이 우리 측의 설정 문제입니까?무효화 대신 2 차 캐시 업데이트

+0

이것은 캐시의 용량과 관련 될 수 있습니다. 그걸 확인해 봤어? –

+0

<맵 이름 = "기본"> ... <타임 투 라이브 초> 0 <최대 유휴-초> 0 LRU 5000 <퇴거 비율> 25 100 ...

+0

내가 따라 구성을 변경하지만 우리가 가진 문제는 우리가 요소를 추가 할 것입니다 동작 –

답변

0

제가 직접 질문에 대답 할 수 있다고 생각합니다. 실제로 최대 절전 모드는 이 아니며 컬렉션을 업데이트하지만 항상 무효화합니다. 여기에 다음 설명이 있습니다. http://planet.jboss.org/post/collection_caching_in_the_hibernate_second_level_cache :

캐싱의 의미는 무엇입니까? 음, 핵심은 컬렉션이 캐시에서 업데이트되지 않는다는 것입니다. 캐시에서 무효화 된 다음 나중에 다른 데이터베이스를 읽은 결과로 다시 캐시 될 수 있습니다. 따라서, 만약 어플리케이션이 Group.addMember()를 호출한다면, Hibernate는 그 그룹의 멤버쉽 콜렉션을 캐시에서 제거 할 것이다. JBoss Cache가 2 차 레벨 캐시 구현 인 경우, 제거가 클러스터 주변으로 전달됩니다. ] 렉션은 클러스터의 모든 노드에서 캐시에서 제거됩니다.

나중에 응용 프로그램이 해당 그룹의 구성원에 액세스해야하는 경우 다른 데이터베이스 읽기가 발생하고 구성원의 현재 기본 키 집합이 캐시에 저장됩니다.

0

기본적으로 최대 절전 모드 캐시는 PK에서 키가 설정되므로 findAll()을 수행하면 findOne (id)을 수행 할 때 최대 절전 모드 캐시가 사용되지 않습니다.

findAll()을 캐시하려면 ehcache 및 @Cache 어노테이션을 사용하고 캐시에 사용하는 키를주의하십시오. http://www.ehcache.org/documentation/2.8/get-started/key-classes-methods.html

+0

을 변경하지 않은 동료 . Hibernate는 요소를 추가하기 위해 항상 전체 콜렉션을로드 할 것이다. 문제는 이제 컬렉션이 (우리의 경우에는 이해가 안되는) 2 차 레벨 캐시에서로드 될 수 없다면 항상 전체 컬렉션을로드하도록 데이터베이스를 쿼리한다는 것입니다. –

+0

@JanSchaefer이 캐시를 직접 담당해야합니다. 나는 틀린 것을 증명하게 행복하지만, 나는 당신과 똑같은 문제를 여러 번 경험해왔다. –