gpt4 book ai didi

java - 确保始终从 Spring 应用程序的缓存中检索数据

转载 作者:搜寻专家 更新时间:2023-11-01 01:55:20 25 4
gpt4 key购买 nike

在使用 Spring 框架构建的 Java EE 应用程序中,我需要在 DAO 中执行一些非常昂贵的操作,这可能需要长达几分钟的时间。使用 Spring MVC,当用户的请求映射到 Controller 方法时,我通过 Controller 访问 DAO:

@RequestMapping(value = "/categories.do")
public ModelAndView categories(
@PathVariable("cc") String cc,
@PathVariable("ll") String ll) {
Locale locale = new Locale(ll, cc);
ModelAndView result = getView("categories", locale);
Map<Category, List<Product>> allProducts = supplyDao.getAllProducts(locale);
result.addObject("products", allProducts);
return result;
}

getAllProducts 方法向外部网络服务发出大量请求,以绘制产品所需的所有数据。该方法通过 Spring 的 @Cacheable 缓存。注释,在底层 Ehcache 实现上:

@Cacheable(value = CACHE_NAME, key = CACHE_KEY_PREFIX + "'(' + #p0 + ')'")
public Map<Category, List<Product>> getAllProducts(Locale locale) {
// a lot of HTTP requests firing from here
}

这种方法的问题在于,当缓存为空时,页面基本上无法访问。此外,如果缓存为空时有多个请求命中页面,DAO 方法将再次触发,所有请求将并行重复。据我了解,第二个问题的解决方案是使用 BlockingCache ,但我还没有机会实现它。

我想要的是让 Controller 方法始终从缓存中提取结果。我想实现一个 @PostConstruct触发所有区域设置的缓存填充的方法。像这样的东西:

@PostConstruct
public void populateCaches() {
for (Locale locale : localeList) {
getAllProducts(locale);
}
}

我不介意初始填充需要一段时间,因为服务器很少重新启动。我还将缓存过期设置为大约三天 - 数据不会经常更新,并且不提供最新版本也没有危险。

我想做的是运行 TimerTask以设定的时间间隔,比方说两天 23 小时,这将强制 DAO 方法从 Web 服务中提取所有产品数据。然后,该数据将替换缓存中的数据,而不会过期。然后缓存过期计数器将被重置——数据将在三天后再次过期。这样, Controller 方法将始终从缓存中获取产品数据,并且页面会响应。

我的问题是,鉴于我使用的是 Spring's cache abstraction,我将如何实现这种方法? ?我是否需要在我的方法中直接处理 CacheManager

另一个问题是:我是否正确地处理了问题?有更好的方法吗?

最佳答案

在缓存可用之前阻止调用

@Cacheable(cacheName="yourCache", decoratedCacheType= DecoratedCacheType.SELF_POPULATING_CACHE)
public List<String> getWhatever(int id) {
//call database
}

您可以使用自动刷新缓存代替计时器任务:

@Cacheable(cacheName="yourCache", refreshInterval=1000, decoratedCacheType= DecoratedCacheType.REFRESHING_SELF_POPULATING_CACHE)
public List<String> getWhatever(int id) {
//call database
}

kudos

关于java - 确保始终从 Spring 应用程序的缓存中检索数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11357914/

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