我有一个表,其中包含经常读取,很少更改的记录(大约50,000个),我需要缓存这些记录。我希望在服务器启动时使用单个查询加载所有记录来预先填充缓存。我不确定使用Spring annotations时最好的方法是什么。我从文档中发现的唯一方法是在一个服务方法中加载所有实体,而不是将它们传递给另一个使用@CachePut
注释的服务中的方法,并且不执行任何其他操作。
PreloaderService:
@AutoWired
private CacheService cacheService;
public void getAllWidgets() {
List<Widget> widgets = ... load them in one query
for (Widget widget: widgets) {
cacheService.populate(widget); //must call a different class so that it Spring's proxy for @CachePut gets used
}
}
CacheService:
@CachePut
public void populate(@CacheValue Widget widget){
//do nothing else, all we need is the caching annotations to be processed
}
以上对我来说并不是很优雅,但看不到另一种方式。顺便说一下,我使用Ehcache以防下级API实现这一点。