Java com.google.common.cache.CacheLoader原因分析

Posted 张志翔ۤ

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java com.google.common.cache.CacheLoader原因分析相关的知识,希望对你有一定的参考价值。

问题描述

今天在使用guava cache的时候,报了如下错误:

com.google.common.cache.CacheLoader$InvalidCacheLoadException: CacheLoader returned null for key 50816009.
        at com.google.common.cache.LocalCache$Segment.getAndRecordStats(LocalCache.java:2346)
        at com.google.common.cache.LocalCache$Segment.loadSync(LocalCache.java:2316)
        at com.google.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2278)
        at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2193)
        at com.google.common.cache.LocalCache.get(LocalCache.java:3932)
        at com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:3936)
        at com.google.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:4806)

之前使用的时候一直都挺正常的,没有出现过此类异常,调用代码如下:

/** 本地缓存 */
private LoadingCache<Long, ServiceInfo> queryByCategoryIdCache = CacheBuilder.newBuilder().refreshAfterWrite(CacheConstants.SERVICE_INFO_CACHE_REFRESH_TIME, TimeUnit.SECONDS)
    .maximumSize(CacheConstants.MAX_SIZE_PER_CACHE).build(new CacheLoader<Long, ServiceInfo>() {
        public ServiceInfo load(Long categoryId) {
            return getServiceInfoByCategoryId(categoryId);
        }
});
 @Override
    public ServiceInfo getServiceInfoByCategoryIdWithCache(long categoryId, boolean withCache) {
        if (withCache) {
            try {
                return queryByCategoryIdCache.get(categoryId);
            } catch (Throwable t) {
                logger.error("query serviceInfo exception", t);
                return null;
            }
        } else {
            return getServiceInfoByCategoryId(categoryId);
        }
}

原因分析

后来又仔细看了下报错信息,大概意思是结果的返回值为null,而guava缓存中又不会存放value为null的数据,导致抛出异常。如果业务流程中,允许存在结果为null的话,只需要捕获到该异常后,返回null就行,可以忽略产生的一次信息。示意代码如下:

@Override
public ServiceInfo getServiceInfoByCategoryIdWithCache(long categoryId, boolean withCache) {
    if (withCache) {
        try {
                return queryByCategoryIdCache.get(categoryId);
        } catch (Throwable t) {
                return null;
        }
    } else {
        return getServiceInfoByCategoryId(categoryId);
    }
}

到此 Java com.google.common.cache.CacheLoader原因分析介绍完成。

以上是关于Java com.google.common.cache.CacheLoader原因分析的主要内容,如果未能解决你的问题,请参考以下文章

Java 布尔运算

java [Java] Java常用代码#java

Java - 35 Java 实例

Java While 循环

Java 字符串

Java If ... Else