2016-11-22 58 views
1

在我們的項目中,我們使用Infinispan和Spring的@Cacheable註釋,主要用於緩存I/O結果。由於我們有很多併發調用,我們希望避免2個線程執行兩次相同的數據檢索,因此第二個@Cacheable方法調用(使用相同的緩存鍵)會被阻塞,直到第一個線程完成並返回結果爲止。是否可以使用Infinispan作爲阻塞緩存?

我習慣了Ehcache的SelfPopulatingCache它自動支持這個,但是Infinispan有沒有類似的功能?

理想情況下,這應該通過Spring的@Cacheable使用,以便我們避免樣板代碼。我注意到Spring 4.3現在有@Cacheable.sync(),但它表明它只是一個提示,它取決於基礎的緩存提供者實現。另外,我們不在Spring 4.3上,所以4.2的解決方案會更好。

+0

Spring的JCache適配器代理調用[invoke方法](https://github.com/spring-projects/spring-framework/blob/master/spring-context-support/src/main/java/org/springframework /cache/jcache/JCacheCache.java#L80)作爲'sync'功能。所以支持似乎很可能,或者你可以直接調用它。 –

+0

@BenManes JCacheCache只能委託給底層的JCache,但不會自動阻塞,對吧? –

+0

'invoke'應該是原子的,所以它在等待輪到時可能會阻塞。實際上,它應該像'sync(key)'一樣,而不是無鎖的讀取,因爲除非使用加載器,否則JCache不允許這樣做。 –

回答

2

如果你想要這個功能開箱即用,你將不得不升級到4.3。如果你使用4.2,升級到4.3應該是無痛的(如果情況並非如此,請告訴我們!)

正如Ben已經提到的那樣,你可以使用明確支持這種調用的JCache橋它將適用於任何符合JSR-107的緩存庫)。 Infinispan沒有這樣的本地功能,但我只是submitted a feature request in their tracker