gpt4 book ai didi

java - Spring Boot启动时加载数据到Ehcache 3

转载 作者:行者123 更新时间:2023-12-01 22:13:04 28 4
gpt4 key购买 nike

我想在 Spring Boot 应用程序启动时加载缓存中的数据。我知道Ehcache2中有一种使用BootstrapCacheLoader的集成方式。 How to load data from database to Ehcache when the application starts但我在 Ehcache3 中没有看到这一点。我仍然可以在 @postConstruct 方法中手动完成此操作。但我想知道是否有一个集成的解决方案(Spring 5,Ehcache 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);
}
}

关于java - Spring Boot启动时加载数据到Ehcache 3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58642911/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com