【发布时间】:2019-01-06 12:52:05
【问题描述】:
我正在学习 Spring Data Rest,但我没有找到如何在 Spring Data Rest 中使用 Cache。 如何将 Cache 与 Spring Data Rest 的 curd/page 一起使用。 还是应该使用 JPA+Cache 而忽略 Spring Data Rest?
如果我有什么误解,请提醒我。
最好的尊重
【问题讨论】:
标签: spring-data-jpa spring-data-rest
我正在学习 Spring Data Rest,但我没有找到如何在 Spring Data Rest 中使用 Cache。 如何将 Cache 与 Spring Data Rest 的 curd/page 一起使用。 还是应该使用 JPA+Cache 而忽略 Spring Data Rest?
如果我有什么误解,请提醒我。
最好的尊重
【问题讨论】:
标签: spring-data-jpa spring-data-rest
您可以尝试以下方法:
1) 覆盖您的 repos 方法 findById 和 findAll,将它们设为 Cacheable:
public interface MyEntityRepo extends JpaRepository<MyEntity, Long> {
@Cacheable("myEntities")
@Override
Optional<MyEntity> findById(Long id);
@Cacheable("pagedMyEntities")
@Override
Page<MyEntity> findAll(Pageable pageable);
}
2) 创建一个RepositoryEventHandler 来驱逐你的缓存:
@RepositoryEventHandler
public class MyEntityEventHandler {
private final CacheManager cacheManager;
public MyEntityEventHandler(CacheManager cacheManager) {
this.cacheManager = cacheManager;
}
@HandleAfterCreate
@HandleAfterSave
@HandleAfterDelete
public void handleCachesEviction(MyEntity entity) {
Optional.ofNullable(cacheManager.getCache("myEntities"))
.ifPresent(c -> c.evict(entity.getId()));
Optional.ofNullable(cacheManager.getCache("pagedMyEntities"))
.ifPresent(c -> c.clear());
}
}
3) 当然还要创建一个缓存管理器 bean,例如:
@EnableCaching
@SpringBootApplication
public class Application {
@Bean
public CacheManager cacheManager() {
return new ConcurrentMapCacheManager();
}
}
【讨论】: