当我的Spring Boot应用程序启动时,我想在缓存中加载数据。
我知道在Ehcache2中有使用BootstrapCacheLoader的集成方法。
How to load data from database to Ehcache when the application starts
但是我在Ehcache3中看不到这一点。
我仍然可以在@postConstruct方法中手动进行操作。
但是我想知道是否有集成解决方案(春季5,Ehcache 3)

谢谢。

最佳答案

在Spring上下文初始化之后,我结束了它。
对于数据库集合中的每个元素,我都调用具有@Cacheable批注的getResourceById(),从而为整个数据库集合填充缓存。

我不建议在@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 - 在Spring Boot启动时将数据加载到Ehcache 3,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58642911/

10-11 19:24
查看更多