当前位置: 首页 > 知识库问答 >
问题:

如何使用JavaSpring Boot缓存

张逸清
2023-03-14

我有javaSpring启动应用程序。我想对经常读取的数据使用缓存。为此,我在我的jar中包含了以下依赖项

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>      
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-cache</artifactId>
    </dependency>

我还使用了@EnableCaching注释

@EnableCaching 
public class SpringBootConfig {
public static void main(String[] args) throws Exception {
    SpringApplication.run(SpringBootConfig.class, args);    
  }
}

使用@Cacheable注释和返回要缓存的数据的函数

@Cacheable(value = "country",key = "'countryCache'+#countryCode")
private Country getCountry(String countryCode) {
    return new Country(countryCode);
}

但我仍然无法缓存数据。有什么我遗漏的吗?

共有3个答案

郭琦
2023-03-14

只有通过代理进来的外部方法调用才会被拦截。这意味着自调用(实际上,目标对象中的一个方法调用目标对象的另一个方法)不会在运行时导致实际的缓存拦截,即使调用的方法被标记为@Cacheable。

另外,我建议在Spring引导中使用Ehache实现,这允许您执行条件缓存

宋嘉懿
2023-03-14

仅允许公开可用于公共批注的@intercepter。但是,如果需要,您可以获得“CacheManager”服务,并在代码中使用它在私有方法中内部处理缓存。但只有解决一些“特殊”问题,通常的方法是注释公共方法。

如果您使用的是简单的Spring实现,那么也只能使用基本的Spring内存。

考虑您的应用程序将如何工作(单个应用程序,分布式应用程序,缓存的短/长数据量,...)和内存消耗,以添加任何支持的缓存管理器的依赖项,如ehCache,Hazelcast,咖啡因,...性能。

邵飞鸿
2023-03-14

您是否已经看过《快速入门指南》中有关缓存数据的内容?

有一段将解释缓存在代码中不起作用的原因。

@EnableCaching注释触发一个后处理器,该后处理器检查每个Springbean是否存在公共方法上的缓存注释。如果找到这样的注释,将自动创建一个代理来拦截方法调用并相应地处理缓存行为。

因为您的getCountry方法是私有的,所以缓存不起作用。也许你缓存调用方法的结果是合理的?

 类似资料:
  • 我正在尝试获取postgresql表的列名。我尝试过使用information_模式,但在我的javamvc项目中不起作用。我该怎么办? 这实际上是我关于StackOverflow的第一个问题,如果我的问题很难理解,我很抱歉。非常感谢。

  • 我在向Postgresql表中插入整数数组时遇到问题,我该怎么做? 其中ball Numbers和ball NumbersMegaBall是ArrayList。用两位数填充。 以下是PostgreSQL表: 这是来自Springboot的错误: 出现意外错误(类型=内部服务器错误,状态=500)。PreparedStatementCallback;错误的SQL语法[INSERT in draw_r

  • 我的@cacheable方法有下一个签名: 该过滤器使用reporisoty,以limit作为分页参数,返回实体列表。我正在尝试在向系统添加实体时更新缓存: java.lang.ClassCastException:不能将com.java.domain.Entity强制转换为java.util.List

  • 我调用服务器数据通过使用ajax在index.html.它是完美的获取这些数据。现在,我正在和服务人员一起工作。我可以缓存所有的静态资产(图像,js,css),并在Chrome开发工具的应用程序选项卡中的缓存存储中检查这些缓存的资产。我可以在网络选项卡中看到这些资产也被缓存(磁盘缓存)。 现在,我想使用ServiceWorker缓存这些ajax响应(图像文件数组)。在“网络”选项卡中,我可以看到它

  • 我在我的web应用程序中使用hibernate ehcache。我缓存了列表,如下所示。 EHCACHE.xml 我的输出: 我的Ebtity Class: 每次放置计数增加 11。但没有其他值更改。为什么第二级缓存未命中? 为什么每次都执行查询而不是从二级缓存中获取结果? 为什么第二级放置计数在我命中它应该更新而不是插入的同一查询时增加?任何帮助都将不胜感激!!!

  • 问题内容: 我对Docker的层缓存表现出色感到惊讶,但我也想知道它如何确定是否可以使用缓存的层。 让我们以这些构建步骤为例: 例如,它如何知道可以使用缓存的层,但可以为其创建新层呢? 问题答案: 在Dockerfile最佳实践构建缓存部分中相当详尽地解释了构建缓存过程。 * 从缓存中已存在的基本映像开始,将下一条指令与从该基本映像派生的所有子映像进行比较,以查看是否其中一个是使用完全相同的指令构