2012-10-29 4 views
2

다음과 같은 문제가 있습니다. JBoss 5.1, JPA/Hibernate를 2 차 레벨 캐시와 함께 사용합니다. 시스템에 동일한 데이터베이스 테이블을 매핑하는 엔티티가 거의 없습니다. 예 : 테이블 가구는 엔티티 'Furn'및 '가구'로 매핑됩니다.최대 절전 모드 2 차 캐시 업데이트

이 클래스는 변경할 수 없습니다.

이제 ID가 1 인 'Furn'의 데이터를 변경할 때 ID 1 인 'Furniture'에 이전 데이터가 남아 있습니다. 'Furn'가 업데이트 된 후에 'Furniture'를 퇴출시킬 가능성이 있습니까?

+0

사실 나는 모든 엔티티와 테이블에 대한 완전한 지식을 가지고 있기 때문에 Hibernate가 이것을 자동으로 (버그?)해야한다고 생각합니다. –

+0

많은 사람들은 hibernate가 엔티티 대신에 원시 데이터를 캐시해야한다고 제안하지만, 캐시 리스팅은 캐시 된 행이 아닌 엔티티를 포함합니다. – androdevo

답변

3

당신이/업데이트 개체를 삭제하면 알림이 전송됩니다 해당 가구의 객체를 축출하기 위해 다음과 같은 코드를 사용할 수 있습니다 변경 사항을 반영하기 위해 캐싱 레이어.

캐시 키는 다른 서버에 브로드 캐스트 될 수도 있으므로 관련 항목을 플러시하기에 충분한 원격 엔드 정보를 제공하기에 충분한 페이로드를 전달해야합니다. 그러나 다른 한편으로는 처리량을 최대화하기에는 너무 클 수 없습니다. 당신은 디버깅을하는 경우

, 당신은 (그것이 당신의 영속 객체 유형, 식별자에 따라 달라질 수 있습니다 - 합성 여부 등)에 다음과 같은 구조를 볼 수 있습니다 :

cacheKey = {org.hibernate.cache.CacheKey} 
|- key = {your.own.serializable.class} 
|- type = {org.hibernate.type.ComponentType} 
| |- typeScope = {org.hibernate.type.TypeFactory$TypeScopeImpl} 
| | |- factory = {org.hibernate.impl.SessionFactoryImpl} 
| |- propertyNames = {...} 
| |- propertyTypes = {...} 
| |- propertyNullability = {...} 
| |- propertySpan = 2 
| |- cascade = {...} 
| |- joinedFetch = {...} 
| |- isKey = true 
| |- tuplizerMapping = {...} 
|- entityOrRoleName = {java.lang.String} "my.Entity" 
|- entityMode = {org.hibernate.EntityMode} 
|- hashCode = 588688 

당신이 볼 수 있듯이, Hibernate 캐시 키는 클래스 이름, id 타입 등에 관한 정보를 저장한다. 두 가지 타입이 있다면, 두 개의 서로 다른 캐시 키에 매핑되어 문제가된다.

두 엔터티에 대해 DAO 클래스를 만들 수 있으며 해당 엔터티를 유지하기위한 모든 호출이 해당 엔터티와 다른 곳을 통해서만 진행되도록 할 수 있습니다. 그런 다음 두 항목 모두의 update/delete 메소드에서 단순히 다른 엔티티를로드하고 제거하십시오.

다른 옵션은 interceptors을 사용하여 동일한 기능을 달성하는 데 도움이되지만 DAO 경로가 더 깨끗합니다.

2

두 엔티티에 동일한 테이블을 매핑하는 것은 권장되지 않으므로 최대 절전 모드가 자동으로 처리하지 않을 것이라고 생각합니다.

당신은 가구용 엔티티에 대한 포스트 플러시 리스너를 구현하고

// This creates a proxy if not already loaded 
// other gives the object 
Furniture furniture = session.load(Furniture.class,furn.getId()); 
// remove from first level cache 
session.evict(furniture); 
// remove from second level cache 
sessionFactory.evict(Furniture.class,furn.getId()); 
+0

최대 절전 모드가 처리 할 수 ​​없음을 확인하는 문서를 제공 할 수 있습니까? 나는 단지 확신하고 싶다. 축출 정보를 보내 주셔서 감사합니다. 내가 캐시 리스너와 함께 사용하는 것에 대해 일찍 생각했지만 신뢰할 수 있다면 나는 100 % 확실하지 않다. – androdevo

관련 문제