spring-boot - 如何在使用 sync=true 的 @Cacheable 方法中处理异常
问题描述
我在带有 EHcache 的 Spring Boot 2.0 中使用 @Cacheable,同步 = true。
我知道如果我们设置sync = true,所有线程都会等待,直到一个线程通过执行使用@Cacheable的方法来获取要缓存的值。
如果该方法中有异常会发生什么?其他线程是继续等待还是释放了锁?
解决方案
@Cacheable 注解的想法是您使用它来标记将存储在缓存中的方法返回值。
每次调用该方法时,Spring都会将其调用后的返回值缓存起来,以保证下次使用相同的参数执行该方法时,可以直接从缓存中获取结果,而无需再次执行该方法。Spring 使用键值对缓存方法的返回值。该值是方法的返回结果。
现在来回答您的问题,让我们首先了解什么是同步缓存
同步缓存
在多线程环境中,某些操作可能会同时为同一个参数调用(通常在启动时)。默认情况下,缓存抽象不会锁定任何东西,并且可能会多次计算相同的值,从而破坏了缓存的目的。
对于那些特殊情况,您可以使用sync 属性来指示底层缓存提供程序在计算值时锁定缓存条目。结果,只有一个线程忙于计算值,而其他线程被阻塞,直到缓存中的条目被更新
同步属性的唯一目的是只有一个线程会构建缓存,其他线程会消耗缓存。现在如果在方法执行过程中出现异常,这意味着获得锁的线程将永远不会在缓存中设置任何内容并退出,现在下一个线程将有机会获得锁,因为缓存中不会有任何东西,如果在第二次线程的执行异常发生,然后下一个线程将有机会,直到一个线程为相同的参数设置缓存。
推荐阅读
- java - Java swing:我调用了一次drawString,它多次打印了我的字符串
- php - 如果 Webhooks 和 Jobs Laravel 的 Stripe (iDEAL) 收费成功,则通知前端 Vue SPA
- python - Scipy余弦相似度与sklearn余弦相似度
- google-cloud-platform - 使用 Ansible playbook 在 google cloud (gcp) 中创建实例
- c - 如何模拟“聊天机器人”程序的类似终端的行为?
- javascript - 如何从其父组件访问自定义反应组件功能?
- vim - 防止vim跳转源码
- java - 如何使用 Cassandra Java Driver 为所有查询设置一致性级别?
- c# - 命名空间“Microsoft.AspNetCore.Mvc.Razor”中不存在类型或命名空间名称“RuntimeCompilation”
- c# - 无法让 SceneManagement 脚本工作