1

EhCache 実装を使用して Spring の (3.1) 組み込み CacheManager を使用すると、この投稿に従ってプロキシ モード (デフォルト) で特定の制限があることを理解しています。

Spring 3.1 @Cacheable - メソッドがまだ実行されている

私が持っているシナリオを考えてみましょう:

@CacheEvict(value = "tacos", key = "#tacoId", beforeInvocation = true)
removeTaco(String tacoId) {
    // Code to remove taco
}

removeTacos(Set<String> tacoIds) {
    for (String tacoId : tacoIds) {
        removeTaco(tacoId); 
    }
}

このリポジトリ メソッドでは、removeTacos(tacoIds) を呼び出しても、上記の制限により、実際にはキャッシュから何も削除されません。私の回避策は、上記のサービス層で、複数のタコスを削除したい場合、各タコス ID をループして removeTaco() に渡し、決して removeTacos() を使用しないことです。

ただし、これを達成する別の方法があるかどうかは疑問です。

1) セット内のすべての ID を期限切れにするように EhCache に指示するキーに渡すことができる SpEL 式はありますか?

e.g.  @CacheEvict(value = "tacos", key = "#ids.?[*]") // I know this isn't valid, just can't find the expression.

または、removeTacos() で removeTaco を呼び出して、実際に Cached オブジェクトを期限切れにする方法はありますか?

4

3 に答える 3

4

@Caching アノテーションを使用して、@CacheEvict や @CachePut などの同じタイプの複数のアノテーションを組み合わせることができます。これは、Spring ドキュメントの例です。

@Caching(evict = { @CacheEvict("primary"), @CacheEvict(value="secondary", key="#p0") })
public Book importBooks(String deposit, Date date)
于 2014-09-11T13:34:54.307 に答える
2

あなたは2つのことのうちの1つを行うことができます

@CacheEvict(value = "tacos", allEntries = true)
removeTacos(Set<String> tacoIds)

タコスが削除されるよりも多く読み取られる場合、それほど悪くはありません

また

removeTacos(Set<String> tacoIds) {
    for (String tacoId : tacoIds) {
        getTacoService().removeTaco(tacoId); 
    }
}

サービス (プロキシ) を呼び出して、キャッシュの削除を呼び出します。

于 2013-08-28T03:10:56.290 に答える
1

AFAIK @CacheEvict は、特定のキャッシュ内の単一のエントリ (キーによる) またはすべてのエントリの削除のみをサポートしています。一度に複数のエントリを削除する方法はありません。キャッシュから複数のオブジェクトを配置、更新、または削除する場合 (注釈を使用)、memcached に切り替えることができる場合は、私のプロジェクトSimple Spring Memcached (SSM)を参照してください。

自己呼び出しはプロキシを経由しないため、解決策の 1 つはプロキシ以外のモードに切り替えることです。Anther ソリューション (私はお勧めしません) は、サービス中のサービスへの参照を (autowired フィールドとして) 保持し、それを使用して removeTaco を呼び出すことができます。

数か月前、私のプロジェクトの 1 つで同様の問題が発生しました。Spring Cache は使用しませんでしたが、プロキシも必要とする SSM を使用しました。それを機能させるために、キャッシュ (注釈) をサービスから DAO (リポジトリ) レイヤーに移動しました。自己呼び出しの問題を解決しました。

于 2012-08-08T06:07:44.513 に答える