首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在spring boot中,从具有@transactional注释的方法调用@Cacheable时,@Cacheable不会创建缓存键

在Spring Boot中,当一个带有@Transactional注解的方法调用一个带有@Cacheable注解的方法时,@Cacheable注解不会创建缓存键。

@Transactional注解用于标记一个方法需要在事务中执行。当一个带有@Transactional注解的方法被调用时,Spring会开启一个事务,并在方法执行完成后提交或回滚事务。

@Cacheable注解用于标记一个方法的返回值应该被缓存起来,以便在后续调用时可以直接从缓存中获取结果,而不需要再执行方法体。@Cacheable注解可以指定一个缓存名称,如果没有指定,默认使用方法的签名作为缓存名称。

然而,当一个带有@Transactional注解的方法调用一个带有@Cacheable注解的方法时,Spring会将这两个注解的功能合并起来。具体来说,Spring会先执行带有@Transactional注解的方法,然后再执行带有@Cacheable注解的方法。由于事务的存在,@Cacheable注解不会创建缓存键,因为在事务中,方法的返回值还没有被提交到缓存中。

如果想要在带有@Transactional注解的方法中使用@Cacheable注解创建缓存键,可以将@Cacheable注解放在一个单独的方法中,并在带有@Transactional注解的方法中调用该方法。

以下是一个示例:

代码语言:txt
复制
@Service
public class MyService {

    @Autowired
    private MyCache myCache;

    @Transactional
    public void doSomething() {
        // 执行一些事务操作

        // 调用带有@Cacheable注解的方法
        String result = getCachedData();

        // 继续执行其他操作
    }

    @Cacheable("myCache")
    public String getCachedData() {
        // 从数据库或其他地方获取数据
        return "cachedData";
    }
}

在上面的示例中,getCachedData()方法带有@Cacheable注解,用于创建缓存键。doSomething()方法带有@Transactional注解,用于开启事务。在doSomething()方法中,先执行事务操作,然后调用getCachedData()方法获取缓存数据。

推荐的腾讯云相关产品:腾讯云云数据库Redis(https://cloud.tencent.com/product/redis)

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Spring Boot 缓存Spring Boot缓存

缓存(Cache)就是数据交换缓冲区。 本章介绍 Spring Boot 项目开发怎样来使用Spring Cache 实现数据缓存。...使用spring.cache.cache-names属性可以启动创建缓存 CompositeCacheManager CompositeCacheManager用于组合CacheManager,即可以多个...其核心思想是:当我们调用一个缓存方法时会把该方法参数和返回结果作为一个键值对存放在缓存,等到下次利用同样参数来调用方法将不再执行该方法,而是直接从缓存获取结果进行返回。...之后另一个方法就可以直接相应缓存取出缓存数据,而不需要再去查询数据库。@CachePut注解属性说明如下:  value:缓存名,必填。... beforeInvocation:是否方法执行前就清空,缺省为 false,如果指定为 true,则在方法还没有执行时候就清空缓存,缺省情况下,如果方法执行抛出异常,则不会清空缓存

3.3K30

Spring boot缓存使用

@EnableCaching 它支持Spring注释驱动缓存管理功能,spring boot项目中,我们需要将它添加到带注释引导应用程序类@SpringBootApplication。...@Cacheable 它在方法级别上使用,让spring知道该方法响应是可缓存Spring将此方法请求/响应管理到注释属性中指定缓存。...就像我们可以方法请求中指定缓存,如果没有指定,spring使用所有类字段并将其用作缓存(主要是HashCode)来维护缓存,但我们可以通过提供关键信息来覆盖此行为: @Cacheable(value...CachePut 有时我们需要手动操作缓存,这样可在方法调用之前put(更新)缓存,这个方法让我们更新缓存,并且执行被注释方法Spring执行注释方法,并将其结果放入缓存(根据@CachePut...@Cacheable("student"),该注释该特定方法启用高速缓存,并且高速缓存名称是"student"。

91310

Spring Cache-缓存注解(二)

现在我们再来细化下 ---- 概述 注解 描述 @Cacheable 表明进入方法之前, Spring 会先去缓存服务器查找对应 key 缓存值,如果找到缓存值,那么 Spring不会调用方法...,而是将缓存值读出,返回给调用者;如果没有找到缓存值,那么 Spring 就会执行你方法,将最后结果通过 key 保存到缓存服务器 @CachePut Spring 会将该方法返回缓存缓存服务器...,这里简要注意是, Spring 不会事先去缓存服务器查找,而是直接执行方法,然后缓存。...换句话说,该方法始终会被 Spring调用 @CacheEvict 移除缓存对应 key 值 @Caching 这是一个分组注解,它能够同时应用于其他缓存注解 注解@Cacheable 和@...如上代码所示定义redisCacheManager后就可以引用它了,而对于 key 则是缓存,它支持 Spring 表达式,通过 Spring 表达式就可以自定义缓存 key。

35820

SpringBoot集成Redis和配置Redis做缓存

Redis数据库中所有数据都存储在内存,由于内存读写速度远快于硬盘,因此Redis性能上对比其他基于硬盘存储数据库有非常明显优势,而且Redis提供了对持久化支持,即可以将内存数据异步写入到硬盘...Cacheable调用方法先从缓存查询有没有对应key数据,如果有直接从缓存获取返回,如果没有则执行方法,将返回值存入缓存。...CacheEvict:调用方法后从缓存删除对应key数据 Caching:当一个方法需要查询多个缓存或者删除多个缓存使用 package com.example.demo.service; import...@Cacheable、@CacheEvict、@Caching是基于Spring AOP代理类,内部方法调用时,注解是失效。...举例子,Controller接收请求调用BlogService.save方法 缓存相关注解不生效 @Transactional public int save (Blog blog) { if (

1.1K20

Spring Boot二级缓存配置

Ehcache 使用 Spring Data JPA 进行数据访问,可以使用二级缓存来提高程序性能。 注意 这里使用不是基于Hibernate Ehcache实现。...因此,使用二级缓存,需要根据具体业务场景和需求来决定是否使用以及如何配置和管理缓存。 以下演示了如何在 Spring Boot 应用程序配置 Ehcache 作为二级缓存。.../102660649 * * 切记:缓存配置类配置以后,yaml配置文件关于缓存redis配置就不会生效,如果需要相关配置需要通过@value去读取 */...缓存注解 启用缓存 需要缓存地方类上添加@EnableCaching 添加缓存 方法上添加@Cacheable(cacheNames = "userService.getUserByName",key...相关注解或概念 说明 @EnableCaching 开启基于注解缓存 @Cacheable 主要针对方法配置,能够根据方法请求参数对其结果进行缓存缓存后再次调用方法则直接返回缓存内容。

21510

Springboot整合ehcache缓存「建议收藏」

缓存数据失效前允许闲置时间(单位:秒),仅当eternal=false使用,默认值是0表示可闲置时间无穷大,若超过这个时间没有访问此Cache某个元素,那么此元素将被Cache...清除 timeToLiveSeconds 缓存数据存活时间(单位:秒),仅当eternal=false使用,创建开始计时,失效结束。...对于一个支持缓存方法Spring会在其被调用后将其返回值缓存起来,以保证下次利用同样参数来执行该方法可以直接从缓存获取结果,而不需要再次执行该方法。...Spring缓存方法返回值是以键值对进行缓存,值就是方法返回结果。 @Cacheable可以指定三个属性,value、key和condition。...value属性指定cache名称(即选择ehcache.xml哪种缓存方式存储) key属性是用来指定Spring缓存方法返回结果对应key。该属性支持SpringEL表达式。

87270

(11)SpringBoot整合EhCache做缓存

具有如下特点: 快速 简单 多种缓存策略 缓存数据有两级:内存和磁盘,因此无需担心容量问题 缓存数据会在虚拟机重启过程写入磁盘 可以通过RMI、可插入API等方式进行分布式缓存 具有缓存缓存管理器侦听接口...key,存入缓存;当再次调用方法,若该缓存没有过期,那么当此方法参数和这个key相同时,就会直接去找缓存;我们可以控制台查看打印sql来观察是否访问数据库。...@Cacheable查询,会先从缓存获取,若不存在才再发起对数据库访问。...由于Spring 4新增了@CacheConfig,因此Spring 3原本必须有的value属性,也成为非必需项了。...- beforeInvocation:非必需,默认为false,会在调用方法之后移除数据。当为true,会在调用方法之前移除数据。

98510

微服务架构之Spring Boot(五十二)

32.缓存 Spring框架支持透明地向应用程序添加缓存本质上讲,抽象将缓存应用于方法,从而根据缓存可用信息减少执行次数。缓存逻辑应用透 明,不会调用者造成任何干扰。...简而言之,将缓存添加到服务操作就像在其方法添加相关注释一样简单,如以下示例所示: import org.springframework.cache.annotation.Cacheable; import...调用 computePiDecimal 之前,抽象 piDecimals 缓存查找与 i 参数匹配条目。 如果找到条目,则缓存内容会立即返回给调用者,并且不会调用方法。...但是,我们强烈建议您不要混用和匹配 Spring Cache和JCache注释。 如果您不添加任何特定缓存库,Spring Boot会自动配置在内存中使用并发映射 简单提供程序。...当需要缓存(例如前面示例 piDecimals ),此提供程序会为您创建缓存。简单提供程序并不是真正推荐用于生产用途,但它非常适合入门并确保您了解这些功能。

49430

SpringBoot整合SpringCache简单使用和介绍

同一类本地调用无法通过这种方式被拦截;本地调用,此类方法缓存注释将被忽略,因为Spring拦器甚至不会在这种运行时场景起作用。...对于更高级拦截模式,请考虑将其切换为AdviceMode.ASPECTJ 。 order 指示特定连接点上应用多个建议,高速缓存访问程序执行顺序。...由于put操作性质,调用方法后将评估此表达式,因此可以引用result unless SpEL表达式用于否决缓存放置操作,默认值为"" ,表示永远不会否决缓存。...由于put操作性质,调用方法后将评估此表达式,因此可以引用result allEntries 是否删除缓存所有条目。...默认情况下,仅删除关联值,请注意,不允许将此参数设置为true并指定key 。 beforeInvocation 调用方法之前是否应进行删除。

55350

SpringBoot整合SpringCache简单使用和介绍

同一类本地调用无法通过这种方式被拦截;本地调用,此类方法缓存注释将被忽略,因为Spring拦器甚至不会在这种运行时场景起作用。...对于更高级拦截模式,请考虑将其切换为AdviceMode.ASPECTJ 。 order 指示特定连接点上应用多个建议,高速缓存访问程序执行顺序。...由于put操作性质,调用方法后将评估此表达式,因此可以引用result unless SpEL表达式用于否决缓存放置操作,默认值为"" ,表示永远不会否决缓存。...由于put操作性质,调用方法后将评估此表达式,因此可以引用result allEntries 是否删除缓存所有条目。...默认情况下,仅删除关联值,请注意,不允许将此参数设置为true并指定key 。 beforeInvocation 调用方法之前是否应进行删除。

43620

Spring Cache+Redis缓存数据

当需要重复地获取相同数据,一次一次地请求数据库或者远程服务,导致在数据库查询或远程方法调用上消耗大量时间,最终导致程序性能降低,这就是数据缓存要解决问题。   ...当标记在一个方法表示该方法是支持缓存;当标记在一个类上则表示该类所有的方法都是支持缓存。...对于一个支持缓存方法方法执行前,Spring先检查缓存是否存在该方法返回数据,如果存在,则直接返回缓存数据;如果不存在,则调用方法并将方法返回值写入缓存。   ...默认情况下,如果方法执行抛出异常,则不会清空缓存。 2.3、@Cacheput   使用该注解标志方法,每次都会执行,并将结果存入指定缓存。...其他方法可以直接响应缓存读取缓存数据,而不需要再去查询数据库。一般用在新增方法上。 2.4、@Caching   该注解可以一个方法或类上同时指定多个Spring Cache相关注解。

89130

6000 字 | 统一缓存帝国 - 实战 Spring Cache

1.3 Spring Cache 有什么功效 每次调用方法,而此方法又是带有缓存功能Spring 框架就会检查指定参数那个方法是否已经被调用过,如果之前调用过,就从缓存取之前调用结果;如果没有调用过...Spring Cache 注解会帮忙方法创建一个切面(aspect),并触发缓存注解切点(poinitcut),听起来太绕了,简单点说就是:Spring Cache 注解会帮忙调用方法之后,...去缓存方法调用最终结果,或者方法调用之前拿缓存结果,或者删除缓存结果,这些读、写、删缓存脏活都交给 Spring Cache 来做了,是不是很爽,再也不用自己去写缓存操作逻辑了。...调用 test 方法后,Redis 中就创建出了 hot 缓存了,然后缓存了一个 key,如下图所示: 第二次调用 test 方法,就从缓存 hot 中将 test 方法缓存结果 222 取出来了...2.8 删除缓存注解 @CacheEvict 注解方法调用不会缓存添加任何东西,但是会缓存移除之前缓存结果。

23920

统一缓存帝国,实战 Spring Cache!

1.3 Spring Cache 有什么功效 每次调用方法,而此方法又是带有缓存功能Spring 框架就会检查指定参数那个方法是否已经被调用过,如果之前调用过,就从缓存取之前调用结果;如果没有调用过...Spring Cache 注解会帮忙方法创建一个切面(aspect),并触发缓存注解切点(poinitcut),听起来太绕了,简单点说就是:Spring Cache 注解会帮忙调用方法之后,...去缓存方法调用最终结果,或者方法调用之前拿缓存结果,或者删除缓存结果,这些读、写、删缓存脏活都交给 Spring Cache 来做了,是不是很爽,再也不用自己去写缓存操作逻辑了。...第二次调用 test 方法,就从缓存 hot 中将 test 方法缓存结果 222 取出来了,为了验证没有执行 test 方法,大家可以 test 方法打下 log 或者断点。...2.8 删除缓存注解 @CacheEvict 注解方法调用不会缓存添加任何东西,但是会缓存移除之前缓存结果。

41550

SpringBoot 实战 (十一) | 整合数据缓存 Cache

做过开发都知道程序瓶颈在于数据库,我们也知道内存速度是大大快于硬盘,当需要重复获取相同数据,一次又一次请求数据库或者远程服务,导致大量时间耗费在数据库查询或远程方法调用上,导致性能恶化,这便是数据缓存要解决问题...4 个注解如下表示: 注解 解释 @Cacheable 方法执行前 Spring 先查看缓存是否有数据,若有,则直接返回缓存数据;若无数据,调用方法方法返回值放入缓存 @CachePut 无论怎样...都有 value 属性,指定是要使用缓存名称;key 属性指定是数据缓存存储。...= # 程序启动创建缓存名称 spring.cache.ehcache.config= # ehcache 配置文件地址 spring.cache.hazelcast.config= # hazelcast...但控制台无 SQL 语句打印,也无为id、key 为2数据做了缓存这句话输出。 说明 @Cacheable 确实做了数据缓存,第二次测试结果是数据缓存获取,并没有直接查数据库。 ?

1.1K20

一起来学 SpringBoot 2.x | 第十篇:使用 Spring Cache 集成 Redis

或者 Redis),而是一个对缓存使用抽象,通过既有代码添加少量它定义各种 annotation,即能够达到缓存方法返回对象效果。...key 和 condition 支持 AspectJ,并通过其实现任何方法缓存支持 支持自定义 key 和自定义缓存管理者,具有相当灵活性和扩展性 2....添加依赖 pom.xml 添加 spring-boot-starter-data-redis依赖 org.springframework.boot...属性配置 application.properties 文件配置如下内容,由于Spring Boot2.x 改动,连接池相关配置需要通过spring.redis.lettuce.pool或者 spring.redis.jedis.pool...(如:@Cacheable(value="user",key="#userName")) value: 缓存名称, Spring 配置文件定义,必须指定至少一个(如:@Cacheable(value

47110

(转载非原创)SpringBoot系列(十五)整合缓存,项目会用得到技术

规范:  JCache规范定义了一种对Java对象临时在内存中进行缓存方法,包括对象创建、共享访问、假脱机(spooling)、失效、各JVM一致性等,可被用于缓存JSP内最经常读取数据,如产品目录和价格列表...>spring-boot-starter-cache 然后我们逐个介绍一下缓存开发中用到一些注解。...主要是用于方法之上,将方法结果作为缓存值,默认情况下将方法参数作为缓存(key),也就是key-value形式存储数据。...如果查到了值就返回给请求客户端,如果没有查到这个值就调用方法,然后将方法返回结果缓存起来。...@Caching允许同一方法上使用多个嵌套 @Cacheable、@CachePut和@CacheEvict注释。实际上就是,各个缓存注解可以配合使用,操作不同缓存空间。

43720

SpringBoot(十四)缓存还是要用起来

规范: JCache规范定义了一种对Java对象临时在内存中进行缓存方法,包括对象创建、共享访问、假脱机(spooling)、失效、各JVM一致性等,可被用于缓存JSP内最经常读取数据,如产品目录和价格列表...>spring-boot-starter-cache 然后我们逐个介绍一下缓存开发中用到一些注解。...主要是用于方法之上,将方法结果作为缓存值,默认情况下将方法参数作为缓存(key),也就是key-value形式存储数据。...如果查到了值就返回给请求客户端,如果没有查到这个值就调用方法,然后将方法返回结果缓存起来。...@Caching允许同一方法上使用多个嵌套 @Cacheable、@CachePut和@CacheEvict注释。实际上就是,各个缓存注解可以配合使用,操作不同缓存空间。

49620

Spring Boot 开发离不开这些注解,快来学习啦!

Spring Boot 是一款非常流行 Java 框架,其注解用法复杂而丰富。 介绍 Spring Boot 注解之前,我们需要先了解 Spring 框架 AOP(面向切面编程)概念。...启用该注解Spring Boot 将根据类路径和配置文件信息来尝试猜测并配置应用程序。...当容器 XML 文件、Java 配置类或其他方式加载不会创建这个 Bean。...@Cacheable @Cacheable 注解表示方法结果应该被缓存起来,下次调用方法,如果参数和之前相同,则返回缓存结果。...; } } @CachePut @CachePut 注解表示方法结果应该被缓存起来,下次调用方法不会返回缓存结果,而是重新计算结果并缓存起来。

32420

Spring cache 使用Redis做分布式缓存

@Cacheable:配置了getUserById函数返回值将被加入缓存。同时查询,会先从缓存获取,若不存在才再发起对数据库访问。...由于Spring 4新增了@CacheConfig,因此Spring 3原本必须有的value属性,也成为非必需项了 key:缓存对象存储Map集合key值,非必需,缺省按照函数所有参数组合作为...它参数与@Cacheable类似,具体功能可参考上面对@Cacheable参数解析 @CacheEvict:配置于函数上,通常用在删除方法上,用来从缓存移除相应数据。...当为true,会移除所有数据 beforeInvocation:非必需,默认为false,会在调用方法之后移除数据。当为true,会在调用方法之前移除数据。...由于Spring Cache通过AOP来实现,那就需要增强代理,如果注解用在内部方法上,必然是不会生效 这里有一篇文章,是别人写Spring Cache注解不生效问题,并且详细说明了原因:为什么私有方法

49920
领券