这是一个问题,我一直试图处理近一个星期而没有找到真正的解决方案,这就是问题所在。
在我的Angular客户端,我有一个按钮来生成一个以这种方式工作的CSV文件:
如果要返回的数据量很少,那么一切都很好,当我必须返回大量数据时问题就开始了。从2000行开始我就像JBOSS服务器开始努力发送像i这样的数据#39;数据容量达到了一定的限制(我的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
答案 0 :(得分:0)
我在其他情境中(使用RMI)发现,你越是本地化,压缩就越少。您的机器可能会在压缩和解压缩所需的处理工作上丢失大部分时间。数据量越大,损失就越大。
除非您确实需要将其作为一个列表发送,否则您可以考虑发送条目列表。以页面方式请求它们以减少一个响应发送的数据量。即使您确实需要客户端的单个列表,也可以在传输后进行组装。
答案 1 :(得分:0)
要衡量绩效,我们需要检查完整的跟踪。
有很多方法可以做到这一点,这是我发现它的方法之一。
找出确切原因:
从流程的单次运行中收集线程转储。从该线程转储中,我们可以检查图层的确切时间消耗并找出问题所在。
希望有所帮助!
[编辑]
您应该分析转储中的堆栈跟踪,而不是链接中添加的堆栈跟踪。
如果大部分数据无法按请求处理,
示例REST URL:
http://localhost:8080/App/{id_user}/transactionCSV?limit=1000
http://localhost:8080/App/{id_user}/transactionCSV?fromDate=2011-08-01&toDate=2016-08-01
http://localhost:8080/App/{id_user}/transactionCSV?user=Admin
答案 2 :(得分:0)
我确信问题来自服务器尝试一次发送大量数据。有没有办法我可以发送几个小块而不是一个大块的http答案?