加快控制器响应速度的方法

问题描述 投票:0回答:1

我有一个休息服务(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分钟才能做出响应,还有其他方法可以加快响应时间吗?

java spring multithreading asynchronous
1个回答
0
投票

如果您对代码进行了分析(当您遇到性能问题时应该总是这样做),您会注意到除了创建ErrorReason对象(您尝试使用ForkJoinPool解决)的时间之外,还有很多时间将包括将ErrorReason对象转换为JSON,即返回文本。

提高性能的一种可靠方法是忘记完全创建ErrorReason对象,然后直接将原始JSON写入响应主体。

它不会很漂亮,但是再次将430,000个对象写入响应也不是很漂亮。由于您不再进行不必要的text->object->text转换,因此您可以保证性能的大幅提升。

© www.soinside.com 2019 - 2024. All rights reserved.