概述
基于springboot版本2.0.x
使用caffeine作为本地应用缓冲时,碰见一个暗坑,caffeine做了10分钟缓冲失效配置(expireAfterWrite(10))
下面是具体数据表查询缓存代码
@Cacheable(cacheNames = MerchantCacheConfig.CACHE_NAME, key = "#merId")
public MerchantDTO selectByMerId(String merId) {
return this.selectByMerIdDB(merId);
}
正常有merId商户数据情况下通过商户编号(merId)查询都没什么问题,突然有一天新增一家商户时怎么都查找不到商户的信息,看日志中出现下面错误
java.util.concurrent.CompletionException: java.lang.ClassCastException: org.springframework.cache.support.NullValue cannot be cast to net.easipay.fg.masterdata.dto.PsMerchantSecurityConfigDTO at java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:273) at java.util.concurrent.CompletableFuture.completeThrowable(CompletableFuture.java:280) at java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1592) at java.util.concurrent.CompletableFuture$AsyncSupply.exec(CompletableFuture.java:1582) at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289) at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056) at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692) at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157) Caused by: java.lang.ClassCastException: org.springframework.cache.support.NullValue cannot be cast to net.easipay.fg.masterdata.dto.PsMerchantSecurityConfigDTO at net.easipay.fg.masterdata.manager.config.cache.PsMerchantSecurityCacheConfig$1.reload(PsMerchantSecurityCacheConfig.java:80) at com.github.benmanes.caffeine.cache.CacheLoader.lambda$asyncReload$2(CacheLoader.java:191) at java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1590) ... 5 common frames omitted
经过排查和场景判断,可能缓存上面出现了超出认识上的问题,排查中发现正常流程是应该配置商户信息后开始该商户业务流程,但商户信息记录未正常配置后,通过该商户编号(merId)进行了查询,此时数据表中是查询不到记录的,也就是null,Cacheable将null缓存了,后续补充了商户记录后,本以为商户数据会10分钟后失效再重新缓冲时,就出现了上面的异常信息,缓存中同一个merId之前已经是null,后续对象无法更新缓存。
解决方式:
@Cacheable(cacheNames = MerchantCacheConfig.CACHE_NAME, key = "#merId" , unless="#result == null")
public MerchantDTO selectByMerId(String merId) {
return this.selectByMerIdDB(merId);
}
标签中增加unless,排查查询结果null的数据
最后
以上就是标致樱桃为你收集整理的springboot使用caffeine cache是出现暗坑的全部内容,希望文章能够帮你解决springboot使用caffeine cache是出现暗坑所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复