2017-10-31 7 views
0

コンポーネントをキャッシュするときにカスタムキーを生成するのにKeyGeneratorを使用しています。ここでSpring ehcache - カスタムキーに基づいて値を取得できません

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

KeyGenerator実装です:

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()); }

キャッシュから値を取得している間、私のようにキーを生成しています。ここ はキャッシュ可能な方法であり、

しかし、それは常にnullを返します。

答えて

1

問題は、StringBuilderをキャッシュキーとして使用していることです。 StringBuilderには、equalsまたはhashCodeが定義されていません。したがって、それはObjectで定義されたものに依存します。

基本的には、キャッシュエントリを取得するために使用されるgetがエントリを格納する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つのハッシュコードを追加する場合でも。したがって、指定したキーにエントリを混在させることができます。

関連する問題