2014-12-22 2 views
0

Hibernate 용 L2 분산 캐시로 Hazelcast를 성공적으로 사용하고 있습니다. 쿼리 캐시가 분산되지 않는 것 같습니다. '최대 절전 쿼리 캐시'에 분산 캐시를 사용할 수 있습니까? 또는 '쿼리 캐시'도 배포되도록 구성이 누락 되었습니까? Hazelcast 3.2.6과 Grails 2.2.3 사용하기.Hibernate에서 분산 쿼리 캐시를 갖는 방법은 무엇입니까?

+0

쿼리 캐시가 배포되지 않았다는 것을 어떻게 알 수 있습니까? 또한 쿼리 캐시는 쿼리 수준에서 구성을 필요로합니다 (캐시 가능으로 표시). –

+0

@AndyDufresne 분산 L2 캐시를 성공적으로 사용할 수는 있지만 쿼리 캐시는 기본적으로 분산되지 않으며이를 수행 할 문서가 없습니다. – Champ

+0

쿼리 캐시가 배포되지 않았 음을 어떻게 확인합니까? 어떤 분산 캐시 공급자를 사용합니까? JBoss TreeCache? –

답변

4

"주의 : QueryCache는 노드에 항상 로컬이며 위험 캐스트 클러스터에 배포되지 않습니다."는 hazelcast 설명서에서 제공됩니다. 어쩌면 HazelcastLocalCacheRegionFactory를 Hibernate regionFactory config에 사용하여 로컬 노드에 데이터를 저장하고 엔트리가 로컬로 업데이트/삭제 될 때 무효 메시지를 보내는 경우 일 수 있습니다. RegionCache를 구현 DistributeQueryCacheHazelcastFactory 만들기 - 여기

는 hazelcast 문서 http://docs.hazelcast.org/docs/3.4/manual/pdf/hazelcast-documentation-3.4.pdf 177 페이지

+0

최대 절전 모드로 QueryCache가 항상 로컬인지 확인합니까? – Champ

1

내가 솔루션을 테스트하고있어하지만 분명히 작동 ...

1입니다.

2 -이 클래스 안에 HazelcastCacheRegionFactory + AbstractHazelcastCacheRegionFactory의 내용을 넣으십시오 (buildQueryResultsRegion이 최종로 표시되어 있기 때문에이 작업을 수행해야합니다).

3 - AbstractTransactionDataRegion (작성해야 함)을 확장하고 QueryResultsRegion을 구현하는 DistributedQueryCacheDataRegion 클래스를 리턴하려면 buildQueryResultsRegion을 구현하십시오.

4 - "hibernate.cache.region.factory_class"등록 정보를 작성한 DistributeQueryCacheHazelcastFactory로 변경하십시오.

5 - 분산 캐시에 쿼리를 캐시하려면

query.unwrap (org.hibernate.Query.class) .setCacheable (TRUE); query.unwrap (org.hibernate.Query.class) .setCacheRegion ("cacheName")

캐시 영역이 Hazelcast에서이 쿼리에 대해 만든 맵의 이름이됩니다 캐시를 ​​배포했습니다.

각 쿼리 캐시의 크기에주의하십시오.

즐기십시오!

0

@ Luís Otávio Braga가 제안한 것처럼, 나는 hazelcast를 사용하여 최대 절전 쿼리 캐시를 배포하기위한 솔루션을 구현했습니다. 답을 완료하기 몇 가지 차이와 더 많은 정보가 있습니다 : 나는 내 자신의 파일에 AbstractHazelcastCacheRegionFactory 복사, 그냥 마지막으로하지의 buildQueryResultsRegion() 방법을 변경

  1. 은. 이것은 내가 (상대적으로) 미래의 업그레이드를 쉽게 할 수있게 해준다. 단 하나의 변화가 유일한 방법의 수정 자 하나라는 것을 알기 때문이다.
  2. DistributedQueryCacheDataRegion는 QueryResultsRegion을 구현하지만

    AbstractGeneralRegion<IMapRegionCache> 
    
  3. 에게 buildQueryResultsRegion() 메소드의 구현된다 연장 :

    @Override 
    public QueryResultsRegion buildQueryResultsRegion(String regionName, Properties properties) throws CacheException { 
        return new DistributedQueryCacheDataRegion(instance, regionName, properties, new IMapRegionCache(regionName, 
          instance, properties, null)); 
    } 
    

그래서 전체 코드는 :

AbstractHazelcastCacheRegionFactory 최대 절전 모드와 동일, 최종 설정 만 buildQueryResultsRegion().

DistributeQueryCacheHazelcastFactory :

/** 
    * Similar to com.hazelcast.hibernate.HazelcastCacheRegionFactory, only differences: 
    * 1. Extends our own implementation of AbstractHazelcastCacheRegionFactory. 
    * 2. Override buildQueryResultsRegion() to return DistributedQueryCacheDataRegion (that's why we needed our own 
    * implementation of AbstractHazelcastCacheRegionFactory to be able to override). 
    * 
    */ 
    public class DistributeQueryCacheHazelcastFactory extends AbstractHazelcastCacheRegionFactory { 

    private static final long serialVersionUID = 1L; 

    public DistributeQueryCacheHazelcastFactory() { 
     super(); 
    } 

    public DistributeQueryCacheHazelcastFactory(final HazelcastInstance instance) { 
     super(instance); 
    } 

    public DistributeQueryCacheHazelcastFactory(final Properties properties) { 
     super(properties); 
    } 

    @Override 
    public QueryResultsRegion buildQueryResultsRegion(String regionName, Properties properties) throws CacheException { 
     return new DistributedQueryCacheDataRegion(instance, regionName, properties, new IMapRegionCache(regionName, 
      instance, properties, null)); 
    } 

    @Override 
    public CollectionRegion buildCollectionRegion(final String regionName, final Properties properties, 
     final CacheDataDescription metadata) throws CacheException { 
    return new HazelcastCollectionRegion<IMapRegionCache>(instance, regionName, properties, metadata, 
      new IMapRegionCache(regionName, instance, properties, metadata)); 
    } 

    @Override 
    public EntityRegion buildEntityRegion(final String regionName, final Properties properties, 
     final CacheDataDescription metadata) throws CacheException { 
     return new HazelcastEntityRegion<IMapRegionCache>(instance, regionName, properties, metadata, 
      new IMapRegionCache(regionName, instance, properties, metadata)); 
    } 

    @Override 
    public TimestampsRegion buildTimestampsRegion(final String regionName, final Properties properties) 
     throws CacheException { 
     return new HazelcastTimestampsRegion<IMapRegionCache>(instance, regionName, properties, new IMapRegionCache(
      regionName, instance, properties, null)); 
    } 

} 

DistributedQueryCacheDataRegion :

public class DistributedQueryCacheDataRegion extends AbstractGeneralRegion<IMapRegionCache> implements 
    QueryResultsRegion { 

    protected DistributedQueryCacheDataRegion(HazelcastInstance instance, String name, Properties props, 
     IMapRegionCache cache) { 
     super(instance, name, props, cache); 
    } 

    } 

마지막으로, 새로운 DistributeQueryCacheHazelcastFactory 클래스에 최대 절전 모드 구성 hibernate.cache.region.factory_class에 공장을 변경해야합니다.

+0

본질적으로 Luis와 동일한 답변을 올렸습니다. 문제에 대한 자세한 정보를 제공하는 곳을 자세히 설명해 주시겠습니까? 건배! –

+0

그것은 Lui의 대답을 기반으로하지만 정확하지는 않습니다. 첫 번째 변경은 두 클래스를 하나의 클래스로 "병합"하지 않도록하고 2 클래스의 업그레이드에서 가능한 변경 사항을 따르고 하나의 복제본을 만들었습니다. 따라하기 쉽습니다. 두 번째로, buildCollectionRegion()을 구현하는 방법에 대한 세부 사항은 Lui의 답변에 지정되어 있지 않습니다. 마지막으로, 제네릭 인터페이스 및 코드 샘플을 사용하여 구현에 대한 자세한 내용을 추가했습니다. –

관련 문제