2016-11-22 4 views
1

私たちのプロジェクトでは、主にI/O結果をキャッシュするためにInfinispanとSpringの@Cacheable注釈を使用しています。Infinispanをブロッキングキャッシュとして使用することはできますか?

複数の同時呼び出しがあるので、2つのスレッドが同じデータ取得を2回実行するのを避けたいので、最初の呼び出しが完了して結果を返すまでブロックをブロックします(同じキャッシュキーを使用します)。

私はこれを自動的にサポートするEhcacheのSelfPopulatingCacheに慣れていますが、Infinispanにも同様の機能がありますか?

理想的には、これはSpringの@Cacheableによって使用されるべきであり、定型記号を避けることが理想です。私は、Spring 4.3が今や@Cacheable.sync()を持っていることに気付きましたが、ヒントに過ぎず、基礎となるキャッシュプロバイダの実装に依存していることが示されています。また、私たちはSpring 4.3にはまだありませんので、4.2のソリューションがより良いでしょう。

+0

[呼び出すメソッド](https://github.com/spring-projects/spring-framework/blob/master/spring-context-support/src/main/java/org/springframework)を呼び出すためのSpringのJCacheアダプタプロキシ/cache/jcache/JCacheCache.java#L80)に 'sync'機能を追加しました。だから、サポートはおそらく、おそらくあなたはそれを直接呼び出すことができます。 –

+0

@BenManes 'JCacheCache'は基になる' JCache'に委任しますが、自動的にブロックされません。 –

+0

'invoke'はアトミックであると仮定されているので、ターンを待つときにブロックされる可能性があります。実際には、JCacheはローダーを使用しない限り、JCacheが許可していないので、ロックフリーの読み込みではなく、 'sync(key)'のように動作するはずです。 –

答えて

2

この機能をすぐに使用できるようにするには、4.3にアップグレードする必要があります。もし4.2を使用しているなら、4.3へのアップグレードはとにかく問題ないはずです(そうでない場合は、私たちに連絡してください)。

すでに言及したように、このような呼び出しを明示的にサポートしているJCacheブリッジどのJSR-107準拠のキャッシュライブラリでも動作します)。 Infinispanにはまだこのようなネイティブ機能はありません。私はただsubmitted a feature request in their trackerです。

関連する問題