加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 通过接口上的注释使@Cachable条目无效?

发布时间:2020-12-14 05:47:14 所属栏目:Java 来源:网络整理
导读:我正在使用 spring和@Cacheable注释来缓存一些数据库条目.我想定期使完整缓存无效. 因此:将这些注释放在接口方法上是否有效?或者这些注释必须放在类方法上(即使它们有一个空的方法体)? public interface MyRepository extends CrudRepositoryMyEntity,Lon
我正在使用 spring和@Cacheable注释来缓存一些数据库条目.我想定期使完整缓存无效.

因此:将这些注释放在接口方法上是否有效?或者这些注释必须放在类方法上(即使它们有一个空的方法体)?

public interface MyRepository extends CrudRepository<MyEntity,Long> {
    @Override
    @Cacheable("cache")
    Airline findOne(long id);

    @CacheEvict(value = "cache",allEntries = true)
    @Scheduled(cron = "0 0 1 * * *")
    void removeAll();
}

如果我在接口方法上有@Cacheable,在服务中有@CacheEvict,则应用程序会成功启动.如果我使用上面的代码,它不起作用.但也许我也做错了?

解决方法

它可能会起作用,但我建议将这些注释放在实现上.

这更像是一个理论问题,但可以这样思考:接口是一种常见的契约,但缓存是一个实现细节.

您的界面可以通过多种方式实现,例如,有一天您可以拥有一个HsqlDBRepository,缓存完全没有意义,因为它已经存在于内存中.

在旁注中,我会仔细考虑为什么你需要“驱逐所有”…取决于它发生的频率,它可能会使你的缓存无用 – 而且它通常是设计更深层次问题的标志.如果您想在一段时间之后逐出实体,请考虑配置timeToLive / timeToIdle – 大多数缓存后端都能很好地支持这一点.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读