首页
学习
活动
专区
工具
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"。

95810
  • Spring Cache-缓存注解(二)

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

    39920

    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.3K20

    Spring Boot二级缓存配置

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

    36510

    (11)SpringBoot整合EhCache做缓存

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

    1.1K10

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

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

    1.1K70

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

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

    50430

    SpringBoot整合SpringCache的简单使用和介绍

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

    58850

    SpringBoot整合SpringCache的简单使用和介绍

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

    45720

    Spring Cache+Redis缓存数据

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

    98830

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

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

    1.8K20

    一起来学 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

    49510

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

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

    37720

    使用@Cacheable,缓存优化的方式优化数据库的查询

    使用@Cacheable,缓存优化的方式优化数据库的查询 本文讲解在springboot中如何利用@Cacheable,通过添加本地缓存,来优化查询,提升查询效率。...@Cacheable简介 首先,我们需要引入Spring Boot自带的缓存模块,可以在pom.xml文件中添加如下依赖: org.springframework.boot...(String isbn) { // 从数据库中读取图书信息并返回 } 其中,@Cacheable注解表示启用缓存,并指定value参数为book,表示缓存Key; key参数为#isbn,则表示缓存的键名为...Service层的getByIsbn方法时,Spring就会自动从本地缓存中获取相应的数据。...同时,我们还为删除ISBN记录(deleteByIsbn方法)增加了@CacheEvict注解,表示当该方法执行时,会清除与isbn对应的本地缓存。这样,当我们执行删除操作后,就不会出现脏数据。

    10010

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

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

    45920

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

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

    54020

    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 注解的方法在调用时不会在缓存中添加任何东西,但是会从从缓存中移除之前的缓存结果。

    25120

    统一缓存帝国,实战 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 注解的方法在调用时不会在缓存中添加任何东西,但是会从从缓存中移除之前的缓存结果。

    45750
    领券