Sta*_*low 2 java performance spring caching spring-boot
我们正在使用 spring boot 1.5.10Release 版本和 mongodbrepository。
我们有大量数据,因此我们在服务器启动时使用 postconstruct 加载静态数据(从表中选择 *)。
Api 响应大小约为 25MB,我们使用 gzip 对其进行压缩,因此大小变为 5MB。
我们有多个服务,每个服务都包括@PostConstruct加载(从表中选择*)经常使用的数据来准备地图以提高性能。
我们正在从每个服务 1 服务中的 findall db 查询中准备 map<id, custom Obj> 以供参考..
@PostCounstruct Init(){ List list = xyzRepository.findAll(); Map<String, MyObj> map = new HashMap(): for(MyObj Obj : list){ map.put(obj.id, Obj) } }
当 findById / findAll / findByList(List Employees> emps) 调用时,用户将得到地图的快速响应
每个月我们的数据库都会刷新/更新。刷新 db 后,我们将重新启动 Spring Boot 应用程序。
如果数据库在一个月内发生任何数据库刷新(由于某些问题/延迟),我们面临的问题,我们需要重新启动服务器以获取正确的数据而不是陈旧的数据。
我们@Cacheable在每项服务中都尝试过,但第一个 db 命中花费了太多时间。(因为我们正在从表中选择 *)。
我们进行了并行ajax调用来获取数据。应用程序仪表板需要绘制大约 30MB (gzip 5mb) 的数据,这很痛苦..
应用程序 20 个服务的大约 2000 个用户.. 每个服务调用以获取数据(有些是从地图中获取静态数据,在 postcounstruct 中初始化)
目前,当数据库刷新发生时,我们每月都会重新启动服务器。
当发生意外的数据库刷新时,我们如何在不重启服务器的情况下获取最新数据?
---------[Edit-1]-----
赞成的答案建议在每个服务中存在的每个地图中填充新/更新数据。
1.应用程序启动时间会很长,因为地图将从数据库中填充。
2.在Java地图中的某个时间间隔(每晚/隔天/每周)填充/维护数据的开销。
如果每个集合/表和每个月都会增加更多数据怎么办。
需要对赞成的答案进行专家审查。
感谢阅读问题
可以引入一些接口
interface Refreshable {
void refresh();
}
Run Code Online (Sandbox Code Playgroud)
所有在 post 构造期间进行数据缓存的 bean 都应该实现它
@Component
public class SomeDataProvider implements Refreshable {
...
@Override void refresh() { /*here refresh data*/ }
@PostConstruct
public void postConstruct() {
...
refresh();
...
}
}
Run Code Online (Sandbox Code Playgroud)
现在公开休息端点,您可以在更改数据库时调用它
@RestControler
public class ForceRefresh {
@Autowired
private List<Refreshable> refreshables; // here Spring will inject all services which can be refreshed
@PostMapping
public void forceRefresh() {
// refresh concurrently using common thread pool
refreshables.stream().parallel().forEach(Refreshable::refresh);
}
}
Run Code Online (Sandbox Code Playgroud)
或者,您可以实现每晚重新加载,而不是 REST 端点,请参阅 Spring 文档@ @EnableScheduling和@Scheduled。
附带说明 -@PostConstruct用于加载不是最佳方法,因为 Spring 以单线程模式加载 bean。更好地实现ApplicationReadyEvent侦听器,Refreshable如上例所示注入s列表并使用线程池异步加载数据(==利用服务器和 Mongo 上多个 CPU 的全部功能)。