2017-10-31 11 views
0

구성 요소를 캐싱하는 동안 KeyGenerator을 사용하여 사용자 지정 키를 생성하고 있습니다.스프링 ehcache - 사용자 지정 키를 기반으로 값을 검색 할 수 없습니다.

StringBuilder s= new StringBuilder(); s.append(obj1.hashCode().append(obj2.hashCode())); Element elt=CacheManager.getInstance("cacheOne").get(s)

: 같은 캐시로부터 값을 검색하는 동안

public Object generate(Object o, Method m ,Object ... params){ StringBuilder s=new StringBuilder(); return s.append(params[0].hashCode()).append(params[1].hashCode()); }

제가 생성하고 키

여기

@CachePut(value = "cacheOne", keyGenerator = "keyGenerator") public CachedObject cacheMeta(final Object obj1, final Object obj2, final CachedObject cachedObject) { return cachedObject; }

KeyGenerator 구현 : 여기에 캐시 방법

하지만 항상 null를 돌려줍니다.

답변

1

캐시 키로 StringBuilder을 사용하고있는 것이 문제입니다. StringBuilder에는 equals 또는 hashCode이 정의되어 있지 않습니다. 그래서 그것은 Object에 정의 된 것들에 의존합니다.

기본적으로 캐시 항목을 가져 오는 데 get이 항목을 넣는 것과 일치하지 않는다는 것을 의미합니다.

StringBuilder s = new StringBuilder(); 
return s.append(params[0].hashCode()).append(params[1].hashCode()).toString(); 

을 넣어

StringBuilder s = new StringBuilder(); 
s.append("a".hashCode()).append("b".hashCode()); 
Cache.ValueWrapper wrapper = cache.get(s.toString()); 

그것을 해결 얻을 toString()를 사용

.

하지만 나는 말할 거리가 있습니다.

먼저 문자열 연결을 사용하면 후드 아래 StringBuilder을 추가하지만 읽을 때 훨씬 더 좋기 때문에 StringBuilder을 사용하면 쓸모가 없습니다. 그래서 당신은 완벽하게 작동합니다

return params[0].hashCode() + "" + params[1].hashCode(); 

Cache.ValueWrapper wrapper = cache.get("a".hashCode() + "" + "b".hashCode()); 

을하고 동일한 성능을 가질 수 있습니다.

그런 다음 해시 코드를 사용하여 키를 만드는 것은 안전하지 않습니다. 해시 코드는 충돌을 일으킬 수 있습니다. 2 개의 해시 코드를 추가 할 때에도. 따라서 주어진 키에 항목을 혼합 할 수 있습니다.