首页 > 解决方案 > 如何在使用 sync=true 的 @Cacheable 方法中处理异常

问题描述

我在带有 EHcache 的 Spring Boot 2.0 中使用 @Cacheable,同步 = true。

我知道如果我们设置sync = true,所有线程都会等待,直到一个线程通过执行使用@Cacheable的方法来获取要缓存的值。

如果该方法中有异常会发生什么?其他线程是继续等待还是释放了锁?

标签: spring-bootehcache

解决方案


@Cacheable 注解的想法是您使用它来标记将存储在缓存中的方法返回值。

每次调用该方法时,Spring都会将其调用后的返回值缓存起来,以保证下次使用相同的参数执行该方法时,可以直接从缓存中获取结果,而无需再次执行该方法。Spring 使用键值对缓存方法的返回值。该值是方法的返回结果。

现在来回答您的问题,让我们首先了解什么是同步缓存

同步缓存

在多线程环境中,某些操作可能会同时为同一个参数调用(通常在启动时)。默认情况下,缓存抽象不会锁定任何东西,并且可能会多次计算相同的值,从而破坏了缓存的目的。

对于那些特殊情况,您可以使用sync 属性来指示底层缓存提供程序在计算值时锁定缓存条目。结果,只有一个线程忙于计算值,而其他线程被阻塞,直到缓存中的条目被更新

同步属性的唯一目的是只有一个线程会构建缓存,其他线程会消耗缓存。现在如果在方法执行过程中出现异常,这意味着获得锁的线程将永远不会在缓存中设置任何内容并退出,现在下一个线程将有机会获得锁,因为缓存中不会有任何东西,如果在第二次线程的执行异常发生,然后下一个线程将有机会,直到一个线程为相同的参数设置缓存。


推荐阅读