首页 > 解决方案 > 在 Spring Boot 启动时将数据加载到 Ehcache 3

问题描述

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

谢谢你。

标签: javaspring-bootehcache-3

解决方案


在初始化 Spring 上下文之后,我最终完成了它。对于 DB 集合中的每个元素,我调用具有 @Cacheable 注释的 getResourceById(),从而填充整个 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);
}
}

推荐阅读