【问题标题】:Spring Scheduled CacheSpring 定时缓存
【发布时间】:2020-07-29 10:28:54
【问题描述】:

我有一个方法可以在我的 spring-boot 项目中返回列表。此列表是使用 DTO 映射创建的,我不希望我的代码在每次刷新页面时都执行 sql 查询。有时新的更新可能会出现在数据库中。因此,例如,我希望它每 5 小时刷新一次缓存。 Cacheable 正在运行但未接收新数据。我查看了 Cache Evict 示例,但是当我应用它时,我的代码没有进行任何缓存。还有一件事,是否可以在同一方法中缓存多个列表?例如下面的代码,但它不起作用:

@Override
@Cacheable(value = "apps")
@Scheduled(cron = "0 0/30 * * * ?")
@CacheEvict(value = "apps",  allEntries=true)
public List<Apps> executeLatestApplications(){
...
List<Apps> apps = em.createNamedQuery("Apps", Apps.class).getResultList();
...
}

这是应用程序 SQL 结果映射的地方:

@NamedNativeQuery(
        name = "AppsQuery",
        query = "SELECT id, name, address, repo, version FROM apps",
        resultSetMapping = "Mapping"
)

@SqlResultSetMapping(
        name = "Mapping",
        classes = @ConstructorResult(targetClass= com.meursault.apps.model.Apps.class,
                columns = {
                        @ColumnResult(name = "id", type = Long.class),
                        @ColumnResult(name = "name", type = String.class),
                        @ColumnResult(name = "address", type = String.class),
                        @ColumnResult(name = "repo", type = String.class),
                        @ColumnResult(name = "version", type = String.class))

【问题讨论】:

    标签: java spring spring-boot caching


    【解决方案1】:

    我不确定'Cacheable 正在运行但未接收新数据是什么意思。我查看了 Cache Evict 示例,但是当我应用它时,我的代码没有进行任何缓存。

    '@Cacheable 通过缓存方法参数的返回类型来工作,将其视为简单的键/值存储,其中键作为方法参数,值作为返回值。

    你可以有一个单独的@CacheEvict 方法来驱逐allentries

    @CacheEvict(allEntries = true) 
    public void save(App app) {
         em.insert(app);
    }
    

    查看post

    您可以在springdocumentation查看更多信息。

    【讨论】:

    • 我的页面中显示了一个应用程序列表,我尝试使用 swagger 将新应用程序添加到我的数据库中,它不会向我显示新应用程序。再次它不会更新我的缓存
    • 我正在使用 sql 结果映射,它实际上并没有在方法中更新。要更新它必须调用 sql 查询。还有一件事实体管理器没有更新方法??它给出了一个错误
    【解决方案2】:

    我猜问题是您在同一方法中使用@Cacheable(value = "apps")@CacheEvict(value = "apps", allEntries=true)

    使用@CachePut 更新所有条目。

    @Override
    @CachePut(value = "apps")
    @Scheduled(cron = "0 0/30 * * * ?")
    public List<Apps> executeLatestApplications(){
        ...
        List<Apps> apps = em.createNamedQuery("Apps", Apps.class).getResultList();
        ...
    }
    

    【讨论】:

    • 问题是每次刷新页面时仍然返回sql查询,但我不希望这样
    • 那么问题出在你的缓存配置上。添加有问题的缓存配置详细信息。
    • 我只导入可缓存等,并将 spring-boot-starter-cache 依赖项放在我的 pom.xml 上
    • 除了spring-boot-starter-cache,您还需要添加/实现ehcacheredis缓存
    • 它仍然无法与 cacheput 一起使用。代码每次都执行sql查询
    猜你喜欢
    • 1970-01-01
    • 2012-09-17
    • 2013-01-22
    • 1970-01-01
    • 2021-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-13
    相关资源
    最近更新 更多