2010-12-15 1 views
1

OSCache에서 EhCache로 프로젝트 코드를 마이그레이션하려고합니다.전역 EhCache 용량 지정

우리는 OSCache를 두 번째 수준의 최대 절전 모드 캐시 공급자로 사용했을뿐만 아니라 다른 특성을 가진 다른 개체를 저장하기도했습니다. 그들은 서로 겹치지 않는 캐시 키로 인해 충돌없이 동일한 캐시 인스턴스를 행복하게 공유했습니다.

EhCache로 이동할 때 큰 차이점은 각 영역마다 다른 캐시 인스턴스가 있다는 것입니다. 다른 성격의 데이터가 별도로 있기 때문에 조회 속도를 향상시킬 수 있으므로 잠재적으로 유용합니다. 불행히도, 이것은 설정 지옥의 가격이 있습니다. 설명하겠습니다.

OSCache 세계에서 캐시 용량을 10000으로 설정했습니다. 이제 특정 설치가 RAM을 더 많이 필요로하거나 필요로한다면 50000까지 쉽게 쇠약하게 만들 수 있습니다. 이제 EhCache에서 모든 지역에 대해이 델타의 일부로 설정을 변경해야합니다!

또한 하나의 설치는 X 유형의 오브젝트를 많이 사용하지만 다른 설치는 Y 유형의 오브젝트를 더 많이 사용하는 것을 선호 할 수 있습니다. 수십 개의 설치가 있고 각 설치에는 수백 개의 다른 캐시가 있습니다. 이를 위해 캐시 패턴을 모니터링하고 설정을 조정하는 것 외에는 아무 것도하지 않고 수많은 사람들을 고용해야합니다.

CacheManager에는 일종의 전역 캐시 용량 설정이 있고 각 내부 캐시는 항목 사용량에 따라 더 많은 용량을 차지하려고합니다. 그러나 캐시 용량을 설정하는 유일한 방법은 을 통해 CacheManager에 대해 many-to-one을 사용하는 것입니다.

지금까지 볼 수있는 유일한 옵션은 Hibernate가 모든 엔티티에 대해 하나의 전역 캐시를 사용하도록하는 것입니다. 아무도 그렇게하는 법을 알고 있습니까? 저의 시나리오에 대한 다른 해결책이 있습니까?

답변

2

하나의 캐시를 가지고 주변에 데코레이터를 추가해 볼 수 있습니다. 데코레이터는 지역 이름과 일치하는 이름을 가질 수 있으므로 최대 절전 모드에서 해당 캐시를 사용할 수 있지만 장식자는 동일한 캐시를 사용하게됩니다. 따라서 관리 할 캐시 구성은 하나뿐입니다. Custom cache decorators을 구현하고 데코 레이팅 된 캐시의 이름을 설정하여이 작업을 수행 할 수 있습니다.

<defaultCache maxElementsInMemory="10000" eternal="false" 
    overflowToDisk="false"/> 

<cache name="singleSharedCache" maxElementsInMemory="2000" 
    eternal="false" overflowToDisk="false"> 
    <cacheDecoratorFactory class="com.xyz.util.CustomEhcacheDecoratorFactory" 
     properties="name=org.hibernate.tutorial.domain.Person" /> 
    <cacheDecoratorFactory class="com.xyz.util.CustomEhcacheDecoratorFactory" 
     properties="name=org.hibernate.tutorial.domain.Event" /> 
</cache> 

은 "com.xyz.util.CustomEhcacheDecoratorFactory는"장식 ehcaches을 만드는 데 사용되는 사용자 지정으로 Ehcache 장식 공장 클래스입니다 :

이 같은 ehcache.xml 뭔가를 할 수 있습니다. "속성"속성을 사용하여 장식 된 ehcache를 원하는대로 설정할 수 있습니다. 여기서는 name 속성을 사용하여 장식 된 새 ehcache의 이름 만 구성 할 수 있습니다. 다른 모든 작업은 기본 캐시로 위임 될 수 있습니다.

여기에서이 사용 사례에 사용할 수있는 하나의 사용자 정의 캐시 데코레이터를 제공하면 ehcache jar에 들어있는 getCommandAdapter를 다시 사용하고 getName()을 재정의합니다. 생성자를 전달하는 기본으로 Ehcache에 EhcacheDecoratorAdapter 대표 모든 작업 :

 

package com.xyz.util; 

import java.util.Properties; 

import net.sf.ehcache.Ehcache; 
import net.sf.ehcache.constructs.CacheDecoratorFactory; 
import net.sf.ehcache.constructs.EhcacheDecoratorAdapter; 

public class CustomEhcacheDecoratorFactory extends CacheDecoratorFactory { 

    public Ehcache createDecoratedEhcache(final Ehcache cache, 
      final Properties properties) { 
     return new EhcacheDecoratorAdapter(cache) { 
      private final String name = properties.getProperty("name"); 

      public String getName() { 
       return name; 
      } 
     }; 
    } 

    public Ehcache createDefaultDecoratedEhcache(final Ehcache cache, 
      final Properties properties) { 
     return new EhcacheDecoratorAdapter(cache) { 
      private final String name = properties.getProperty("name"); 

      public String getName() { 
       return name; 
      } 
     }; 
    } 
} 

+0

와우,이 답변 주셔서 대단히 감사합니다, 나는 확실히 크리스마스 후이 다시 한 번 봐해야합니다. – mindas