【问题标题】:Load data to Ehcache 3 on Spring Boot start up在 Spring Boot 启动时将数据加载到 Ehcache 3
【发布时间】:2019-10-31 11:59:48
【问题描述】:

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

谢谢。

【问题讨论】:

    标签: java spring-boot ehcache-3


    【解决方案1】:

    在 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);
    }
    }
    

    【讨论】:

      猜你喜欢
      • 2018-07-14
      • 1970-01-01
      • 2023-02-16
      • 2020-09-29
      • 2023-03-21
      • 2021-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多