2012-11-05 5 views
6

프로덕션 환경에서 대규모 VM을 실행 중이며 런타임시 캐시 크기에 대해 더 알고 싶습니다. 내 캐시는 모두 에아 슈를 기반으로합니다.런타임시 Ehcache 캐시 크기

런타임시 개별 캐시의 크기를 확인하는 가장 좋은 방법은 무엇입니까? JMX 또는 API 사용

CacheManager에 대한 plain-old-java 호출로 구성하거나 (큰 순간에 XML 구성 슬러그를 빌드해야하는 경우 JMX를 무시하는 옵션이 있습니까?

답변

10

예, Ehcache를 사용하면 캐시를 구성하고 Java 코드로만 크기를 검색 할 수 있습니다 (XML 구성 없음). 모든 것을 통합하는 정확한 방법은 특정 아키텍처에 달려 있습니다. 나는 저지 (Jersey)가 의존성 주입을 위해 API와 Guice를하고 있다고 가정 할 것이다.

캐시 정의

의존성 주입을 통해 캐시 관리자가 사용할 수 있도록합니다. 이것은 Guice 모듈을 통해 수행 할 수 있습니다 통계가 mycache에 대해 설정되어

@Provides 
@Singleton 
CacheManager provideCacheManager() { 
    CacheManager cacheManager = CacheManager.create(); 

    /* very basic cache configuration */ 
    CacheConfiguration config = new CacheConfiguration("mycache", 100) 
    .timeToLiveSeconds(60) 
    .timeToIdleSeconds(30) 
    .statistics(true); 

    Cache myCache = new Cache(config); 
    cacheManager.addCacheIfAbsent(myCache); 

    return cacheManager; 
} 

공지있다.

다시 말해 캐시를 완전히 Java 코드로 수행 할 수 있지만 아키텍처와 디자인에 따라 다릅니다. 일반적으로 (AOP를 통해) 메소드 인터셉트를 사용하여 이것을 수행하지만, 이는 또 다른 주제입니다. 이제 당신을

@Path("stats") 
@Produces("text/plain") 
public class StatsResource { 
    @Inject private CacheManager cacheManager; 

    @GET 
    public String stats() { 
    StringBuffer sb = StringBuffer(); 

    /* get stats for all known caches */ 
    for (String name : cacheManager.getCacheNames()) { 
     Cache cache = cacheManager.getCache(name); 
     Statistics stats = cache.getStatistics(); 

     sb.append(String.format("%s: %s objects, %s hits, %s misses\n", 
     name, 
     stats.getObjectCount(), 
     stats.getCacheHits(), 
     stats.getCacheMisses() 
    )); 
    } 
    return sb.toString(); 
    } 
} 

:

CacheManager 당신이 다음 REST 엔드 포인트로 묶을 및 캐시 통계에 대한 액세스를 허용 할 수 있습니다 의존성 주입을 통해 볼 수 있습니다

가 주어 REST API를 통해 캐시 통계 가져 오기 REST 통화를 통해 캐시에 대한 정보를 가져올 수 있습니다.

GET /stats 

HTTP/1.1 200 OK 
Content-Type: text/plain; charset=utf-8 

mycache: 8 objects, 59 hits, 12 misses 

JMX는 어떻습니까?

Ehcache를 사용하면 캐시 관리자를 MBean 서버에 쉽게 등록 할 수 있습니다. Java 코드로 수행 할 수 있습니다. 당신의 cacheManager 시스템 MBeanServer에 등록, 당신의 Guice 모듈을 업데이트 :

MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer(); 
ManagementService.registerMBeans(cacheManager, mBeanServer, false, false, false, true); 

지금 당신은 당신의 자바 프로세스에 JConsole의 첨부 MBean의 net.sf.ehcache.CacheStatistics에서 캐시 통계를 확인할 수 있습니다.

+0

캐시에서 힙 사용을 어떻게 얻습니까? 위의 예제에서 - 8 개의 객체가 힙에서 차지하는 바이트 수는 얼마입니까? 우리는 여러 개의 ehcache 인스턴스가 있고 캐시의 힙 사용법을 제공하는 솔루션을 찾고 있습니다. –

+0

버전 2.6부터 시작하는 ehcache는 maxBytesOnLocalHeap()을 사용하여 캐시를 구성하는 방법을 제공합니다. heap usage - http://ehcache.org/documentation/2를 계산하는 것이 편리 할 것입니다.6/configuration/cache-size # local-heap –

+0

Ehcache가 더 이상 getObjectCount()를 제공하지 않는 것 같습니다. 대안이 있습니까? – markthegrea

0

JMX는 확실히 실행 가능한 솔루션입니다. EhCache 의사는 특별히 이것을 위해 page을 가지고 있습니다.

Here's an example JMX를 통해 EhCache를 구성하는 중입니다. 링크 된 기사에는 Spring 설정이 포함되어 있지만 Spring을 사용하지 않는다면 기본 Java로 쉽게 변환 할 수 있습니다.