Java REST 服务应答需要太多时间

标签 java angularjs rest jax-rs export-to-csv

这是一个我已经尝试处理近一周但没有找到真正解决方案的问题,这就是问题。

在我的 Angular 客户端,我有一个用于生成 CSV 文件的按钮,其工作方式如下:

  1. 用户点击按钮。
  2. POST 请求被发送到 REST JAX-RS Web 服务。
  3. Webservice 启动数据库查询并返回一个 JSON,其中包含客户端所需的所有行。
  4. AngularJS 客户端接收 JSON,对其进行处理并生成 CSV。

当要返回的数据量较少时,一切都很好,当我必须返回大量数据时,问题就开始了。从 2000 行开始,我觉得 JBOSS 服务器开始努力发送数据,就像我已经达到了数据容量的一定限制(我的 eclipse 中服务器运行的速度变得非常慢,直到数据传输结束) 问题是,经过测试,我发现花费时间的不是数据库查询或数据格式化,而是数据发送(3000 行,大小为 2 MB,需要大约 1 分钟才能到达客户端),即使在我的开发人员设置中,ANGULAR 客户端和 JBOSS 服务器都在同一台计算机上运行。 这是我的服务器端代码:

@POST
@GZIP
@Path("/{id_user}/transactionsCsv")
@Produces(MediaType.APPLICATION_JSON)
@ApiOperation(value = "Transactions de l'utilisateur connecté sous forme CSV", response = TransactionDTO.class, responseContainer = "List")
@RolesAllowed(value = SecurityRoles.PORTAIL_ACTIVITE_RUBRIQUE)

public Response getOperationsCsv(@PathParam("id_user") long id_user, 
                                 @Context HttpServletRequest request, 
                                 @Context HttpServletResponse response, 
                                 final TransactionFiltreDTO filtre) throws IOException {    
    final UtilisateurSession utilisateur = (UtilisateurSession) request.getSession().getAttribute(UtilisateurSession.SESSION_CLE);
    if (!utilisateur.getId().equals(id_user)) {
        return genererReponse(new ResultDTO(Status.UNAUTHORIZED, null, null));
    } 
    //database query 
    transactionDAO.getTransactionsDetailLimite(utilisateur.getId(), filtre);
    //database query 
    List<Transaction> resultat = detailTransactionDAO.getTransactionsByUtilisateurId(utilisateur.getId(), filtre);
    // To format the list to the export format 
    List<TransactionDTO> liste = Lists.transform(resultat, TransactionDTO.transactionToDTO);
    return Response.ok(liste).build();      
}

你们知道是什么导致了这个问题,或者知道另一种方法来做可能不会导致这个问题的事情吗?我会很感激 。 谢谢你:)

这是 JBOSS 线程转储的链接: http://freetexthost.com/y4kpwbdp1x

最佳答案

我发现在其他环境中(使用 RMI),您的本地化程度越高,压缩的值(value)就越低。您的机器可能将大部分时间浪费在压缩和解压缩所需的处理工作上。数据量越大,这里的损失就越大。

除非您确实需要将其作为一个列表发送,否则您可以考虑发送条目列表。按页请求它们以减少一次响应发送的数据量。即使您确实需要客户端上的单个列表,您也可以在传输后组装它。

关于Java REST 服务应答需要太多时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39995137/

相关文章:

java - 使用 vertx 的 JDBC Oracle 存储过程 ref_cursor

c# - 在数组中,我们如何找到 2 个元素在给定数字中的差异..?少于 O(n^2) 时间

java - opengl Canvas 不更新

javascript - jquery 幻灯片动画无法正常工作

jquery - 如何将 jQuery 与 AngularJS 结合使用

c# - 使用 REST API 返回 XML 文档

java - 有没有一种方法可以在 Java 的一个数组元素中包含多行文本?

javascript - Lync UCWA - 创建应用程序给出 HTTP 409 : Conflict error

java - Jersey 2 : Consumes APPLICATION_FORM_URLENCODED and MULTIPART_FORM_DATA together

javascript - 正则表达式 - 我不断收到 "Nothing to repeat"异常