热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

为什么我使用SpringCache在Service中有缓存未命中-WhyIhavecachemissesinServiceusingSpringCache

Ihaveconfiguredmycacheasfollows:我已按如下方式配置缓存:@Configuration@EnableCachingpublicclassCach

I have configured my cache as follows:

我已按如下方式配置缓存:

@Configuration
@EnableCaching
public class CacheConfig {

    @Bean(name = "caffeineCachingProvider")
    public CachingProvider caffeineCachingProvider() {
        return Caching.getCachingProvider("com.github.benmanes.caffeine.jcache.spi.CaffeineCachingProvider");
    }

    @Bean(name = "caffeineCacheManager")
    public JCacheCacheManager getSpringCacheManager() {
        CacheManager cacheManager = caffeineCachingProvider().getCacheManager();
        CaffeineConfiguration> caffeineCOnfiguration= new CaffeineConfiguration<>();
        caffeineConfiguration.setExpiryPolicyFactory(FactoryBuilder.factoryOf(new AccessedExpiryPolicy(new Duration(TimeUnit.MINUTES, 60))));
        caffeineConfiguration.setCopierFactory(Copier::identity);
        cacheManager.createCache("informerCache", caffeineConfiguration);
        return new JCacheCacheManager(cacheManager);
    }
}

Also I have the @Service that uses it in following way:

我也有@Service以下列方式使用它:

@Service
public class InformerService {

    @CacheResult(cacheName = "informerCache")
    public List getProducts(@CacheKey String category, @CacheKey String countrySign, @CacheKey long townId) throws Exception {
        Thread.sleep(5000);
        // do some work
    }
}

So I have the next behavior.

所以我有下一个行为。

  1. When I'm calling the service method first time it takes 5 seconds then doing some work as expected.
  2. 当我第一次调用服务方法时需要5秒钟,然后按预期进行一些工作。
  3. Calling method the second time with same parameters - > caching works -> returns result immediately
  4. 第二次使用相同参数调用方法 - >缓存工作 - >立即返回结果
  5. Calling the third time with same parameters again results in Thread.sleep
  6. 再次使用相同参数调用第三次会导致Thread.sleep

And all over again.

并且一遍又一遍。

How to solve this ? Is that the issue about proxying ? What did I miss ?

怎么解决这个?这是关于代理的问题吗?我错过了什么 ?

1 个解决方案

#1


3  

As discussed in the comments, this was a bug in the JCache adapter. Thank you for letting me know about this problem. I released version 2.1.0 which includes this fix. That release also includes friendlier initial settings for CaffeineConfiguration which you identified in another post.

正如评论中所讨论的,这是JCache适配器中的一个错误。感谢您告诉我这个问题。我发布了包含此修复程序的2.1.0版。该版本还包括您在另一篇文章中确定的CaffeineConfiguration更友好的初始设置。

While the core library is heavily tested, the JCache adapters relied too heavily on the JSR's TCK (test compatibility kit). Unfortunately that test suite isn't very effective, so I added tests to help avoid these types of mistakes in the future.

虽然核心库经过严格测试,但JCache适配器过于依赖JSR的TCK(测试兼容性工具包)。不幸的是,测试套件不是很有效,因此我添加了测试以帮助避免将来出现这些类型的错误。

This issue only occurred in JCache because its version of expiration is not supported by Caffeine's core library. Caffeine prefers to use an O(1) design that eagerly cleans up expired entries by using fixed durations. JCache uses per-entry lazy expiration and the specification authors assume a capacity constraint is used to eventually discard expired entries. I added a warning to the documentation about this feature, as it could be error prone. While none of the other JCache implementations go beyond this, a pending task is to decide on a mechanism to help mitigate this JCache design flaw.

此问题仅发生在JCache中,因为Caffeine的核心库不支持其过期版本。咖啡因更喜欢使用O(1)设计,该设计通过使用固定的持续时间来急切地清理过期的条目。 JCache使用每个条目的延迟到期,并且规范作者假设容量约束用于最终丢弃过期的条目。我在文档中添加了有关此功能的警告,因为它可能容易出错。虽然其他JCache实现都没有超出此范围,但一项待定任务是决定一种机制来帮助缓解这种JCache设计缺陷。

Thanks again for reporting this issue. As always, feel free to reach out if you have any other issues or feedback to share.

再次感谢您报告此问题。与往常一样,如果您有任何其他问题或反馈要分享,请随时与我们联系。


推荐阅读
  • 本文详细介绍如何在SSM(Spring + Spring MVC + MyBatis)框架中实现分页功能。包括分页的基本概念、数据准备、前端分页栏的设计与实现、后端分页逻辑的编写以及最终的测试步骤。 ... [详细]
  • SpringBoot底层注解用法及原理
    2.1、组件添加1、Configuration基本使用Full模式与Lite模式示例最佳实战配置类组件之间无依赖关系用Lite模式加速容器启动过程,减少判断配置类组 ... [详细]
  • 一、Advice执行顺序二、Advice在同一个Aspect中三、Advice在不同的Aspect中一、Advice执行顺序如果多个Advice和同一个JointPoint连接& ... [详细]
  • 如何使用Maven将依赖插件一并打包进JAR文件
    本文详细介绍了在使用Maven构建项目时,如何将所需的依赖插件一同打包进最终的JAR文件中,以避免手动部署依赖库的麻烦。 ... [详细]
  • Hadoop MapReduce 实战案例:手机流量使用统计分析
    本文通过一个具体的Hadoop MapReduce案例,详细介绍了如何利用MapReduce框架来统计和分析手机用户的流量使用情况,包括上行和下行流量的计算以及总流量的汇总。 ... [详细]
  • Gradle 是 Android Studio 中默认的构建工具,了解其基本配置对于开发效率的提升至关重要。本文将详细介绍如何在 Gradle 中定义和使用共享变量,以确保项目的一致性和可维护性。 ... [详细]
  • Spring Security基础配置详解
    本文详细介绍了Spring Security的基础配置方法,包括如何搭建Maven多模块工程以及具体的安全配置步骤,帮助开发者更好地理解和应用这一强大的安全框架。 ... [详细]
  • Maven + Spring + MyBatis + MySQL 环境搭建与实例解析
    本文详细介绍如何使用MySQL数据库进行环境搭建,包括创建数据库表并插入示例数据。随后,逐步指导如何配置Maven项目,整合Spring框架与MyBatis,实现高效的数据访问。 ... [详细]
  • 长期从事ABAP开发工作的专业人士,在面对行业新趋势时,往往需要重新审视自己的发展方向。本文探讨了几位资深专家对ABAP未来走向的看法,以及开发者应如何调整技能以适应新的技术环境。 ... [详细]
  • spring boot使用jetty无法启动 ... [详细]
  • 本文将详细介绍如何配置并整合MVP架构、Retrofit网络请求库、Dagger2依赖注入框架以及RxAndroid响应式编程库,构建高效、模块化的Android应用。 ... [详细]
  • MyBatis入门指南:环境搭建与基础配置详解
    本文详细介绍了MyBatis的基础配置流程,包括在Maven项目中添加MyBatis依赖、IDEA中配置数据库连接、导入SQL脚本以及编写mybatis-config.xml配置文件等关键步骤。 ... [详细]
  • 本文详细介绍了如何使用C#实现不同类型的系统服务账户(如Windows服务、计划任务和IIS应用池)的密码重置方法。 ... [详细]
  • 本文探讨了如何在 Spring MVC 框架下,通过自定义注解和拦截器机制来实现细粒度的权限管理功能。 ... [详细]
  • Beetl是一款先进的Java模板引擎,以其丰富的功能、直观的语法、卓越的性能和易于维护的特点著称。它不仅适用于高响应需求的大型网站,也适合功能复杂的CMS管理系统,提供了一种全新的模板开发体验。 ... [详细]
author-avatar
寒月繁华叶落尽
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有