我必须集成spring和ehcache,并尝试使用 blockingCache 模式实现它
<ehcache:annotation-driven/>
对于共享(默认)和方法,自填充缓存范围有一个选项。你能解释一下有什么区别吗?
还有 @Cacheable 注释 selfPopulating 标记
根据我在某篇文章中的内容
它表示当使用共享时只创建一个实例,并且每次使用相同的缓存名称时都会使用相同的内容,因此如果我使用 selfPopulating < / strong>将一个方法标记为true,
所有线程都试图访问其他方法注释 将@Pacheable与selfPopulating标志设置为true 将保持不变 我不想要
<ehcache:annotation-driven/>
另一方面 self-populating-cache-scope = method 为所有使用@Cacheable注释的方法创建单独实例,并将selfPopulating标志设置为true,这样就不会造成问题。
但是在这种情况下,当我尝试使用 @TriggerRemove 删除元素并给出@Cacheable中使用的缓存名称时,它会在每个单独的实例中搜索以查找值吗?这不是开销吗?
答案 0 :(得分:1)
Eric回答上面的ehcache google小组
在所有情况下都有一个基础Ehcache实例。怎么了 当你设置selfPopulating = true时,SelfPopulatingCache包装器就是 创建
如果cache-scope = shared,那么使用该命名缓存的所有注释都会 使用相同的SelfPopulatingCache包装器如果cache-scope = method则 每个方法创建一个包装器
请注意,在这两种情况下,SelfPopulatingCache都是一个包装器 仍然只有一个支持包装器的实际缓存
至于阻止,如果您阅读SelfPopulatingCache的文档和 BlockingCache你会注意到ehcache之间做出妥协 缓存级别锁定和通过键条带化的每键锁定。 http://ehcache.org/apidocs/net/sf/ehcache/constructs/blocking/BlockingCache.html