【问题标题】:Java spring caching, saveAll proper handling of updatejava spring 缓存,saveAll 正确处理更新
【发布时间】:2019-10-02 00:20:54
【问题描述】:

所以我目前尝试在我的 Spring Boot 应用程序中SAFELY尽可能多地缓存。

老兄,我遇到了脑筋急转弯。 如何处理 saveAll(list of entity) 方法?

 public List<WorkaroundEntity> saveAll(List<WorkaroundEntity> workaroundEntities) {

此方法保存所有实体,我当前的缓存如下所示:

  /**
    * K=WorkaroundEntity.id   --   Value=WorkaroundEntity
   */
   private static final String CACHE_NAME_WORKAROUNDS = "workarounds";

所以基本上我的地图有 ID 和实体。 当用户保存所有实体的列表时。从我的角度来看,我只有这个选项:

@CacheEvict(value = CACHE_NAME_WORKAROUNDS, allEntries = true, condition = "#workaroundEntities.size()>=1")
public List<WorkaroundEntity> saveAll(List<WorkaroundEntity> workaroundEntities) {
    return workaroundEntityRepository.saveAll(workaroundEntities);
}

我错了吗?对于这类问题有更好的解决方案吗?

到目前为止,我在方法中使用了这个缓存:

public WorkaroundEntity save(WorkaroundEntity workaroundEntity)
public WorkaroundEntity findById(long id)
public void delete(WorkaroundEntity workaroundEntity) 
public WorkaroundEntity getOne(long id) 

您如何处理使用集合而不是单个实体的方法?

【问题讨论】:

  • 不要为此使用 Spring Cache... 您的 JPA 提供程序提供了您应该使用的缓存集成,它已经处理了所有这些。不要使用 Spring Cache 来缓存存储库方法调用。假设您使用的是 Hibernate,您应该考虑使用二级缓存。当实体被更新/保存时,您的 save(all) 方法不会一直被调用(托管实体具有更改检测并且更改会自动持久化),并且您的缓存将不再是最新的。
  • @M.Deinum bud 按照这个概念,我什至不应该对 findById 等使用缓存注释,:-O 对吗?我将研究二级缓存
  • 正确你不应该...如果你使用二级缓存,所有实体都可以被缓存,休眠将相应地更新它,并使用它来获取数据。在您的情况下,每个方法都有自己的缓存,它只会根据传入的参数存储结果,并将结果作为值存储。因此,甚至可能一个查询可以存储同一对象的多个实例(如果不使用正确的键等,导致同一对象的 findById 和 findByName 可以存储相同的实例)。恕我直言,使用 Spring Cache 缓存 JPA 实体是错误的工作工具。
  • @M.Deinum 所以从我所见,我所要做的就是将@Cacheable 添加到实体上,框架会处理它吗?当然,在 application.properties 等中配置一些东西,这听起来太容易让人难以置信;)
  • 您需要确定要缓存哪些实体(因此是@Cacheable)并配置休眠以使用二级缓存并实际配置二级缓存。正确配置后,您可以公开一些 Hibernate 指标以查看缓存是否被命中。美丽之处在于它还会在更新/插入实体时处理缓存中的更新。见vladmihalcea.com/…

标签: java spring jpa caching spring-data


【解决方案1】:

最后,我的答案是同时使用休眠二级缓存和弹簧缓存。我得到了最好的两个词。除此之外,我还创建了额外的 linternal 缓存以更少地访问数据库。

【讨论】:

    猜你喜欢
    • 2016-08-19
    • 1970-01-01
    • 2016-12-16
    • 2020-11-16
    • 1970-01-01
    • 2012-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多