`
nuistcc
  • 浏览: 84097 次
社区版块
存档分类
最新评论

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);
        }
    }

 

 

分享到:
评论
1 楼 youjianbo_han_87 2017-08-01  
分析的太简单,应该贴出分析过程

相关推荐

    com.google.common.jar

    com.google.common.annotations com.google.common.base com.google.common.collect com.google.common.io com.google.common.net com.google.common.primitives com.google.common.util.concurrent 源码...

    com.google.common.collect jar包

    此外,Guava的`com.google.common`包不仅仅局限于集合,还有`cache`模块用于缓存,`primitives`模块处理基本类型,`functional`模块提供函数式编程的支持,等等。这些工具共同构成了一个强大而全面的Java开发工具箱...

    com.google.common.collect.Lists的jar包

    com.google.common.collect.Lists的jar包

    com.google.common.collect

    在Java编程领域,`com.google.common.collect`是一个非常重要的包,它是Google的Guava库的一部分。Guava是一个广泛使用的开源库,提供了许多实用的集合框架、缓存、原生类型支持、并发工具、字符串处理等功能。`...

    google common jar包

    `com.google.common.base.Preconditions`是Google Common库中的一个关键类,它提供了多种静态方法,用于在程序执行前检查条件是否满足,以此来预防运行时异常。这些方法在编写健壮的代码时非常有用,因为它们可以在...

    com.google.common guava 18.0 JAR包

    Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库,例如:集合 [collections] 、缓存 [caching] 、原生类型支持 [primitives support] 、并发库 [concurrency libraries] 、通用注解 [common annotations] ...

    com.google.common|guava.jar

    com.google.common google jar包

    google common jar包1.0

    其中,`com.google.common.base.Preconditions`是这个库中一个非常重要的模块,主要用于在代码中进行参数检查,确保程序的健壮性。 `Preconditions` 类提供了一系列静态方法,用于在执行方法或构造函数时验证输入...

    Android ZXing1.6核心类库(core.jar)

    Files contained in ...com.google.zxing.common.detector.MonochromeRectangleDetector.class com.google.zxing.common.detector.WhiteRectangleDetector.class com.google.zxing.common.reedsolomon.GF256.class ...

    com.google.zxing生成二维码的两个jar包

    对于生成二维码,可以使用`com.google.zxing.common.BitMatrix`和`com.google.zxing.qrcode.QRCodeWriter`类,它们允许你指定二维码的内容、纠错级别和其他参数。 下面是一个简单的示例代码,展示了如何使用ZXing库...

    com.google.zxing.client.j2se.jar下载

    然后,通过`com.google.zxing.common.BufferedImageLuminanceSource`类将图像转换为ZXing可以理解的格式。接下来,利用`com.google.zxing.MultiFormatReader`类进行解码,它可以识别多种条码格式。如果成功,`decode...

    com.ibm.cic.licensing.common.core_7.0.202.v20110429_1203

    只需放入pulign中替换原来文件就行,然后就可以进行破解,打开软件就可以了

    google-common.jar

    本jar包用于导入Google下所需的部分类和内置文件。本jar包用于导入Google下所需的部分类和内置文件

    Google Play 服务_com.google.android.gms_202613000_20.26.13 (000300-319035724)

    版本:20.26.13 (000300-319035724) 适用于安卓4.1-4.4范围的armv7a构架操作系统

    动软生成需要的文件

    `Common`通常包含了一些通用的辅助函数和类,比如字符串处理、日期时间操作、异常处理等,旨在提高代码复用性和减少重复编写基础代码的工作。而`DBUtility`很可能是数据库访问的封装,提供了对数据库操作的简便接口...

    com.borland com.google.common de.javawi javax.media-com.sun

    搞P2P需要的一些包====java的 com.borland.zip com.google.common.all.zip de.javawi.jstun-0.6.1.zip javax.media-com.sun.-net.sf.fmj.jar.zip 收集不易,共享上传给需要的朋友童鞋。。。。

    guava-18.0.jar

    在RocketMQ的过滤器中,`com.google.common.cache.*`的使用可能是为了实现消息过滤的缓存策略,避免频繁的计算过滤条件,提高消息处理速度。RocketMQ是阿里巴巴开源的消息中间件,Guava的集成可以有效地优化其过滤器...

Global site tag (gtag.js) - Google Analytics