11

Ehcacheのデフォルトのキー生成がどのように機能するか知っている人はいますか?次の方法がある場合:

@Cacheable(cacheName = CACHE_KEY) // CACHE_KEY is static final field.
public List<DataObject> list(
    int firstRecord, int maxRecords, int pageSize, FilterObject filter) {
    ....
}

カスタムPOJOはどこにFilterObjectありますか?実際のキャッシュキーは何であると期待できますか?

私が観察しているのは、異なるFilterObjectインスタンスを使用し、メソッド呼び出しの他の引数を変更しない場合、常に同じ結果が生成されることです。最初の呼び出しの結果はキャッシュされて返されます。

おそらくFilterObject、動作を引き起こすのはPOJO.toString()です。関連するメソッドをオーバーライドしていないため、シリアル化または問題のいずれかであると思います。

それでも、EhcacheのWebサイトと@Cacheable注釈ドキュメントの両方で、そのようなメソッドのキャッシュキーがどのように形成されているかについての正確な情報を見つけることができませんでした。このトピックに関する情報と推奨事項をいただければ幸いです。

4

2 に答える 2

13

これはデフォルトのキージェネレータです

public class DefaultKeyGenerator implements KeyGenerator {

public static final int NO_PARAM_KEY = 0;
public static final int NULL_PARAM_KEY = 53;

public Object generate(Object target, Method method, Object... params) {
    if (params.length == 1) {
        return (params[0] == null ? NULL_PARAM_KEY : params[0]);
    }
    if (params.length == 0) {
        return NO_PARAM_KEY;
    }
    int hashCode = 17;
    for (Object object : params) {
        hashCode = 31 * hashCode + (object == null ? NULL_PARAM_KEY : object.hashCode());
    }
    return Integer.valueOf(hashCode);
}

}

ご覧のとおり、各メソッドパラメータのハッシュコードを組み合わせています。

于 2012-03-15T12:07:42.363 に答える
5

すべてはSpringのリファレンスドキュメントで説明されています。

28.3.1.1デフォルトのキー生成

[...]

  • 複数のパラメータが指定されている場合は、すべてのパラメータのハッシュから計算されたキーを返します。

別のデフォルトのキージェネレータを提供するには、org.springframework.cache.KeyGeneratorインターフェイスを実装する必要があります。構成が完了すると、ジェネレーターは、独自のキー生成戦略を指定しない各宣言に使用されます(以下を参照)。

以下:

28.3.1.2カスタムキー生成宣言

[...] @Cacheableアノテーションを使用すると、ユーザーはキー属性を介してキーを生成する方法を指定できます。開発者はSpELを使用して、関心のある引数を選択できます[...]

そして、ドキュメントからの例:

@Cacheable(value="books", key="#isbn.rawNumber")
public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed)

したがって、あなたの場合は、単純にとを実装する必要がequals()ありhashCode()ますFilterObject。まともなIDEはあなたのためにそれらを生成することができます。

于 2012-03-15T12:06:24.087 に答える