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

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  
分析的太简单,应该贴出分析过程

相关推荐

    Google Guava 30.1.1常用类介绍及实践代码

    **Google Guava 30.1.1常用类介绍及实践代码** Google Guava 是一个由 Google 开发的 Java 库,它提供了许多基础工具,包括集合、缓存、原生类型支持、并发库、字符串处理、I/O 等等。在版本 30.1.1 中,Guava 继续...

    使用google guava 实现定时缓存功能

    在IT行业中,Google Guava库是一个非常强大的工具集,它为Java开发人员提供了一系列实用的集合、缓存、并发和I/O工具。本篇文章将详细探讨如何利用Guava库实现定时缓存功能,以提高应用的性能和效率。 首先,Guava...

    java之反射优化(缓存思路)源码

    import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; public class ReflectionUtil { private static LoadingCache, Class&lt;?&gt;&gt; classCache = CacheBuilder.newBuilder() ...

    Getting start with guava

    import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; public class ...

    Java内存缓存工具Guava LoadingCache使用解析

    import com.google.common.cache.*; public class CacheManager { private static final long GUAVA_CACHE_SIZE = 100000; private static final long GUAVA_CACHE_DAY = 10; private static LoadingCache, ...

    JavaCachingwithGuava

    在 Guava 中,`com.google.common.cache` 包包含了缓存相关的类库。 Guava 的缓存功能主要提供简单的内存内缓存功能,并且其内部实现与 `ConcurrentHashMap` 类似,因此具备线程安全特性。值得注意的是,Guava 并不...

Global site tag (gtag.js) - Google Analytics