java - 在 Spring Boot 启动时将数据加载到 Ehcache 3
问题描述
我想在我的 Spring Boot 应用程序启动时在缓存中加载数据。我知道在 Ehcache2 中有一种使用 BootstrapCacheLoader 的集成方式。 如何在应用程序启动时将数据从数据库加载到 Ehcache 但我在 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);
}
}
推荐阅读
- kubernetes - 如何使用默认 Ingress 使用 Kubernetes microk8s 设置 Letsencrypt?
- python - 如何更改代码以便在重新启动后它可以工作并且在终端中可见?
- mysql - docker mysql local-inline db设置问题
- fiddler - 如何在 Android TV 上安装证书?
- python - 我通常在“pyrcc5”中遇到问题,无法识别为内部或外部命令、可运行程序或批处理文件
- python - 有没有办法显示networkx中节点和边缘之间的连接数
- prestashop-1.7 - Prestashop 中的任何想法 是什么意思?
- optimization - Mosek求解器中决策变量值的初始化(通过Cvxpy框架)
- node.js - papertrail 搜索,如何对错误进行分组
- performance-testing - 我们可以使用 Golang 进行 GRPC 调用的性能测试吗?我们也可以将它与 CircleCi 集成吗?