2010-05-25 3 views
4

기존 웹 응용 프로그램에 캐시 솔루션을 구현할 계획입니다. 복잡한 것은 없습니다. 기본적으로 디스크 오버플로 및 자동 퇴거를 지원하는 동시 맵입니다. 캐시를 클러스터링하는 것이 미래에는 요구 될 수 있지만 지금은 필요하지 않을 수 있습니다.ehcache의 copyOnRead 및 copyOnWrite와 동일한 Infinispan

나는 ehcache의 copyOnRead 및 copyOnWrite 기능을 좋아하는데, 이는 내가 캐시에서 가져온 것을 수정하기 전에 수동으로 복제 할 필요가 없다는 것을 의미하기 때문이다. 지금 나는 Infinispan을보기 시작했으나, 거기에 상응하는 것을 발견하지 못했습니다. 그것이 존재합니까?

즉, 다음 단위 테스트 통과해야

@Test 
public void testCopyOnWrite() { 
    Date date = new Date(0); 
    cache.put(0, date); 
    date.setTime(1000); 
    date = cache.get(0); 
    assertEquals(0, date.getTime()); 
} 

@Test 
public void testCopyOnRead() { 
    Date date = new Date(0); 
    cache.put(0, date); 
    assertNotSame(cache.get(0), cache.get(0)); 
} 

답변

2

JBoss의 개발에 따라, Infinispan 아직 이러한 기능을 지원하지 않는다. 당신은 다른 사람들이 투표 할 수 있도록 향상 요청을 Infinispan issue tracker에 기록해야합니다 (나는 그렇게 할 것입니다). 지금이 기능 필요한 경우

는 해결 AbstractDelegatingCache을 연장하고,이 기능을 추가 할 수 getput 메소드를 오버라이드 (override)하는 것, 말했다되고. 자신의 복사 전략을 사용하거나 EHCache가 영감을 얻은 방법을 살펴볼 수 있습니다.

InfinisPan 커뮤니티의 의견이 더 많으므로 더 궁금한 점이 있으시면 Infinispan forum을 고려해보십시오.

+0

감사합니다. 나는 객체 그래프를 올바르게 복사하는 것이 어려운 문제 (일반적인 경우)라고 생각한다. 그래서 나는 그것을 직접하고 싶지 않았다. 당신이 제안한 것처럼 ehcache가 어떻게하는지 살펴 보겠습니다. 그러나 수정하기 전에 캐시에서 가져온 내용을 수동으로 복사하는 것으로 끝날 것입니다. – waxwing

+0

EHCache가 객체를 복사하는 데 사용하는 기본 전략은 Java의 직렬화 메커니즘을 사용하는 것입니다. (객체를 직렬화 한 다음 직렬화를 해제하면 새 인스턴스가 생성됩니다.) 물론, 속도가 느리고 객체가 직렬화 될 수있는 경우에만 작동합니다 (하지만 종종 디스크에 쓰고 싶기 때문에 캐시 된 객체가있는 경우가 많습니다 ...). 하지만 당신은 맞습니다, 객체 그래프를 복사하는 것은 어려운 문제입니다. 저는 과거에 Dozer를 사용 했었습니다. 다음을 참고하십시오 : http://stackoverflow.com/questions/1432764/any-tool-for-java-object- 객체 간 매핑 –

+0

발견 : http://svn.terracotta.org/svn/ehcache/trunk/core/src/main/java/net/sf/ehcache/store/compound/SerializationCopyStrategy.java –

7

Infinispan 은 copyOnRead/copyOnwrite를 지원합니다. 실제 형식은 플러그가 가능하지 않지만. 구성 요소는 Infinispan 4.x에서는 lazyDeserialization이고 0122는 Infinispan 5.x에서 storeAsBinary입니다. 개체는 네트워크를 통한 RPC 호출 및 디스크 저장을 비롯하여 모든 형식의 마샬링에 사용되는 플러그 가능한 Marshaller 프레임 워크를 사용하여 일련 번호가 serialize됩니다.

0

storeAsBinary은 객체가 직렬화되어야 할 때만 적용됩니다. 이는 put 작업이 호출 될 때 소유자가 현재 노드가 아님을 의미합니다.

이것은 키 0의 소유자가 현재 노드가 아니지만 문제가되는 테스트 케이스가 통과 할 수 있음을 의미하지만 단일 노드 환경 인 경우 여전히 실패합니다.

관련 문제