Ehcache - 在数据不存在时使用SelfPopulatingCache

Gan*_*alf 6 java ehcache

我正在使用EhCache的装饰器SelfPopulatingCache,当缓存尝试加载新条目时出现问题,但它不存在(即它在数据库中不存在).因此缓存会将一个null值放入缓存中,以取消阻止密钥上的任何其他获取,但是下一个线程将执行相同的数据库调用,因为它从缓存中收到"null".这意味着它认为需要加载条目 - 即使实际上它是空的,因为数据不存在于任何地方.我觉得我做错了什么.

(伪代码)

Value v = cache.get(key); // multiple threads will block here
if (v == null)
   cache.put(key, getValueFromDB()); // this might put a null value
Run Code Online (Sandbox Code Playgroud)

我目前的解决方案是不放空,而是放置占位符Object并检查它.

Value v = cache.get(key);
if (v == null)
   cache.put(key, getValueFromDB());
else if (v == NOENTRYOBJECT)
   return null;
else
   return v;
Run Code Online (Sandbox Code Playgroud)

思考?

sho*_*222 3

我们做了类似的事情。Boolean.FALSE在我们的例子中,如果请求的密钥不对应于有效的项目,我们就会进入缓存。它基本上告诉调用代码它所要求的密钥与任何数据都不匹配。您需要在第一次请求该密钥时对数据库进行一次调用,以发现它与有效数据不对应,但后续调用可以避免数据库查找。当然,如果曾经将数据输入到该键的数据库中,您需要确保使该缓存条目无效(否则即使有实际数据可用,您也会返回 Boolean.FALSE)。

不确定我的回答是否有那么大的帮助(这不是替代方法),但它至少证明您并不孤单。

顺便说一句,我不认为这是 EHCache 的 SelfPopulatedCache 所独有的。