我有一个休息服务(spring boot),我的一个控制器执行以下操作:以下列格式获取请求体作为json:
{
"type" : "TRERDFDFE43274",
"products" : [
{
"code" : "das",
"reason" : "dasd"
}...
]
}
我的控制器
@RequestMapping(value = "owner/session",
method = RequestMethod.POST,
produces = "application/json;charset=UTF-8")
@ResponseBody
public ResponseEntity<List<ErrorReason>> errorReasons(@Validated @RequestBody Items items) {
final List<Products> prod = items.getProducts();
final List<ErrorReason> reasons = new ArrayList<>();
for(final Products p : prod){
final ErrorReason r = new ErrorReason();
r.setReason(p.getReason);
reasons.add(r);
}
return ResponseEntity.ok(reasons);
}
如您所见,DTO类名为Items,内部项目i有产品列表在生产中,产品列表的大小为430,000。控制器花费大约4分钟来做出响应。我的第一个选择是使用fork join pool的重构代码:
final List<Products> prod = items.getProducts();
final List<ErrorReason> reasons = new ArrayList<>();
final ForkJoinPool pool = new ForkJoinPool(10);
pool.submit(()->{
prod.parallelstream().foreach((p)->{
final ErrorReason r = new ErrorReason();
r.setReason(p.getReason);
reasons.add(r);
})
}).get();
return ResponseEntity.ok(reasons);
现在需要2分钟才能做出响应,还有其他方法可以加快响应时间吗?
如果您对代码进行了分析(当您遇到性能问题时应该总是这样做),您会注意到除了创建ErrorReason
对象(您尝试使用ForkJoinPool
解决)的时间之外,还有很多时间将包括将ErrorReason
对象转换为JSON,即返回文本。
提高性能的一种可靠方法是忘记完全创建ErrorReason
对象,然后直接将原始JSON写入响应主体。
它不会很漂亮,但是再次将430,000个对象写入响应也不是很漂亮。由于您不再进行不必要的text->object->text
转换,因此您可以保证性能的大幅提升。