2012-07-25 58 views
5

Google Guava Cache文档指出:如何处理Google Guava Cache刷新异常?

刷新与驱逐不完全相同。正如LoadingCache.refresh(K)中所指定的那样,刷新密钥可能会异步地加载密钥的新值。旧的值(如果有的话)在键被刷新时仍然返回,与驱逐相反,这会迫使检索等待直到重新加载该值。

如果在刷新时抛出异常,则保留旧值,并且 异常会被记录并吞下。

在我的使用情况中,这种记录和吞吐异常真的很糟糕,因为这意味着如果刷新抛出一个异常,缓存的用户将继续在Cache中找到陈旧的数据。

如何确保在刷新时引发异常缓存开始返回null或调用加载方法?

回答

7

如果您不想提供陈旧的数据,则应该拨打invalidate(key)而不是refresh(key)。这会丢弃key的缓存值(如果存在)。

然后对get(key)的后续调用将同步委托给值加载器,并将重新抛出CacheLoader抛出的任何异常,这些异常包装在(Unchecked)ExecutionException中。

1

如果陈旧的数据对您来说是一个问题,那么您应该使用expireAfterWrite来确保从未提供陈旧的数据。