当前位置: 首页 > 知识库问答 >
问题:

在 Spring Boot 启动时将数据加载到 Ehcache 3

云和硕
2023-03-14

我想在我的Spring Boot应用程序启动时加载缓存中的数据。我知道在Ehcache2中使用BootstrapCacheLoader有一种集成的方法。如何在应用程序启动时将数据从数据库加载到Ehcache,但我在Ehcache3中没有看到这一点。我仍然可以在@postConstruct方法中手动完成。但我想知道是否有集成解决方案(Spring 5,Ehcache 3)

谢谢你。

共有1个答案

蔡默
2023-03-14

我最终在Spring上下文初始化后完成了此操作。对于 DB 集合中的每个元素,我调用 getResourceById(),它具有@Cacheable注释,从而填充整个 DB 集合的缓存。

我不建议在@PostConstruct中运行此代码,因为代理可能尚未创建,并且像@Cacheable这样的注释可能还不起作用。

在触发ContextRefreshedEvent事件(初始化后或刷新后)时运行此代码更适合加载缓存。

public class CacheLoader {

private final Logger logger = LoggerFactory.getLogger(CacheLoader.class);

@Autowired
private ResourcePermissionRepository resourcePermissionRepository;
@Autowired
private ResourcePermissionService resourcePermissionService;


@EventListener
public void onApplicationEvent(ContextRefreshedEvent event) {
    logger.info("Loading cache following start/refresh event");
    for (PermissionGroup permissionGroup : permissionGroupRepository.findAll()) {
        permissionGroupService.getGroupById(permissionGroup.getGroupName());
    }

    for(ResourcePermission resourcePermission: resourcePermissionRepository.findAll()) {
        resourcePermissionService.getResourceById(resourcePermission.getResourceId());
    }
    logger.info("Finished loading cache");
}


public class ResourcePermissionService {

private final Logger logger = LoggerFactory.getLogger(ResourcePermissionService.class);

@Autowired
private ResourcePermissionRepository resourcePermissionRepository;


@Cacheable(value = "resources", sync = true)
 public ResourcePermission getResourceById(String resourceId) {
    logger.info("Cache miss for resource " + resourceId);
    return resourcePermissionRepository.findById(resourceId).orElse(new NullResourcePermission());
}

@CachePut(value = "resources", key = "#result.resourceId")
public ResourcePermission addResourcePermission(ResourcePermission resourcePermission) {
    return resourcePermissionRepository.save(resourcePermission);
}

@CacheEvict(value = "resources")
public void deleteById(String resourceId) {
    resourcePermissionRepository.deleteById(resourceId);
}
}
 类似资料:
  • 我正在尝试在Java服务器端应用程序中使用ehcache来缓存一些数据。如何在服务器启动时将一些初始数据加载到ehcache。应用程序是具有Spring和数据库连接的基于Web的应用程序。任何人都可以让我知道如何定期刷新这些缓存。 谢啦

  • 现有一个springboot项目,通过扫描二维码查询信息,比如一棵树,扫描二维码后可以看到他相关的信息。但这个项目不止有树类型,还有道路,某个物品。所以将项目分模块开发,核心模块作为一个jar包,复制提供基础服务如数据导入导出。各类型构建成单独的jar。部署时需要那种类型就加载对应的jar。这样做是为了满足不同客户需求。 尝试: java -Xbootclasspath/a:file:./libs

  • 我想在应用程序启动时使用Spring ehCache将数据从数据库加载到缓存中,即在调用任何其他方法之前服务器启动时。我不想使用构造函数。请帮帮我。

  • 我想在应用程序启动时使用Spring ehCache将数据从数据库加载到缓存中,即在调用任何其他方法之前服务器启动时。我不想使用构造函数。请帮帮我。

  • > 该服务使用SpringBoot、Maven、MongoDB和Ehcache。 服务需要一个快速且频繁缓存的服务器,所以最终,我选择了Ehcache。 所有缓存都将以几乎相同的频率调用,因此在这种情况下没有热数据或冷数据。 MongoDB中的原始数据每天都会被定时器服务更新,所以我每天要做的就是将所有更新的数据加载到Ehcache中。 这些数据中的每一项都彼此有联系,就像您使用一个来查找另一个的

  • 本文向大家介绍jquery在启动页面时,自动加载数据的实例,包括了jquery在启动页面时,自动加载数据的实例的使用技巧和注意事项,需要的朋友参考一下 其实,重要的就是这个方法: 具体的在jquery中: 具体的ajax怎么使用,可以查看我的上一篇博客《浅谈ajax在jquery中的请求和servlet中的响应》 在jsp中: 以上这篇jquery在启动页面时,自动加载数据的实例就是小编分享给大家