加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

com.google.common.cache.CacheLoader$InvalidCacheLoadException原因分析

(2015-11-03 16:43:49)
标签:

it

cacheloader

guava

invalidcacheloadexce

分类: 原创

问题描述


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


Java代码 
  1. com.google.common.cache.CacheLoader$InvalidCacheLoadException: CacheLoader returned null for key 50816009 
  2.         at com.google.common.cache.LocalCache$Segment.getAndRecordStats(LocalCache.java:2346 
  3.         at com.google.common.cache.LocalCache$Segment.loadSync(LocalCache.java:2316 
  4.         at com.google.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2278 
  5.         at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2193 
  6.         at com.google.common.cache.LocalCache.get(LocalCache.java:3932 
  7.         at com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:3936 
  8.         at com.google.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:4806 

 

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


Java代码 
  1.   
  2.     private LoadingCache queryByCategoryIdCache CacheBuilder.newBuilder().refreshAfterWrite(CacheConstants.SERVICE_INFO_CACHE_REFRESH_TIME, TimeUnit.SECONDS)  
  3.             .maximumSize(CacheConstants.MAX_SIZE_PER_CACHE).build(new CacheLoader()  
  4.                 public ServiceInfo load(Long categoryId)  
  5.                     return getServiceInfoByCategoryId(categoryId);  
  6.                  
  7.             });  

 

Java代码 
  1. @Override  
  2.    public ServiceInfo getServiceInfoByCategoryIdWithCache(long categoryId, boolean withCache)  
  3.        if (withCache)  
  4.            try  
  5.                return queryByCategoryIdCache.get(categoryId);  
  6.            catch (Throwable t)  
  7.                logger.error("query serviceInfo exception"t);  
  8.                return null 
  9.             
  10.        else  
  11.            return getServiceInfoByCategoryId(categoryId);  
  12.         
  13.     

 

 

原因分析


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

 

Java代码 
  1. @Override  
  2.     public ServiceInfo getServiceInfoByCategoryIdWithCache(long categoryId, boolean withCache)  
  3.         if (withCache)  
  4.             try  
  5.                 return queryByCategoryIdCache.get(categoryId);  
  6.             catch (Throwable t)  
  7.                 return null 
  8.              
  9.         else  
  10.             return getServiceInfoByCategoryId(categoryId);  
  11.          
  12.      

 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有