4

@Cacheableキャッシュミスが発生した場合に、キャッシュ可能メソッドが1回実行されてキャッシュにデータが入力されるまで、キャッシュ可能メソッドへの呼び出しがブロックされるようにSpringを構成できますか?

私の場合、データベースからのデータを扱っていますが、実際にはこのデータが変更された場合、アプリを再起動する必要があります。各サービスの起動時にメソッドを作成してデータを初期化することはできますが、アノテーション@PostConstructほど「エレガント」ではないようです。@Cacheable

@CacheableSpringアノテーションでEhCacheを使用することを計画しています。

アップデート:

他の誰かがそれらの問題に遭遇した場合に備えて、@PostConstructを使おうとして私が遭遇したいくつかの問題があります。@PostConstructメソッドは@Transactional、Springコンテキスト全体が構成された後ではなく、オブジェクトのプロパティが設定された後に実行されるため、実行できません。したがって、TXマネージャがすべてセットアップされ、time@PostConstructメソッドが呼び出されて構成されているとは限りません。これの回避策は、を実装しApplicationListener、TransactionTemplateを手動で挿入することです...など、を使用することで簡略化される多くの追加作業@Cacheable

4

3 に答える 3

2

Spring 4.3 では、同期キャッシュのサポートが追加されました。

@Service
public class FooService {

    @Cacheable(cacheNames = "foos", sync = true)
    public Foo getFoo(String id) { ... }

}

参照: https://spring.io/blog/2016/03/04/core-container-refinements-in-spring-framework-4-3

于 2016-04-10T11:29:25.000 に答える
1

エレガントではないと思います@PostConstructが、私には完璧な解決策のようです。アプリが再起動されたときにのみ呼び出されるメソッドが必要です。何が良いでしょうか?

ただし、これを実行して、キャッシュが利用可能になるまで呼び出しをブロックすることもできます

@Cacheable(cacheName="yourCache", decoratedCacheType= DecoratedCacheType.SELF_POPULATING_CACHE)
public List<String> getWhatever(int id) {
//call database
}

キャッシュを自動更新するには、次のようにします。

@Cacheable(cacheName="yourCache", refreshInterval=1000, decoratedCacheType= DecoratedCacheType.REFRESHING_SELF_POPULATING_CACHE)
public List<String> getWhatever(int id) {
  //call database
}

称賛

于 2012-06-29T13:16:59.270 に答える