在Java Web App中检索大量数据并将其下载到客户端

时间:2018-11-28 16:11:38

标签: java oracle jsf large-files

给出:

  • websphere 上运行的Web应用程序和具有大型表的 oracle数据库
  • 一个jsf网站,允许用户下载 csv 文件中的部分数据。
  • 访问数据库的常规方法是通过JPA(openJPA)
  • 潜在文件下载大小最大为 500MB 至1GB

问题:

如何使用户能够通过Web应用程序在客户端硬盘驱动器上从DB下载如此大的数据,而不会出现OutOfMemory异常/在服务器上存储/缓冲完整数据

1 个答案:

答案 0 :(得分:3)

尝试在单个HTTP请求中执行此操作可能会遇到很多限制。

流和异步处理是两种可能的解决方案。

流式传输

它看起来像JPA 2.2 has added streaming support。为了避免出现内存不足的情况,您可能需要调整JVM,还可能需要调整JDBC提取大小,以平衡数据库性能和客户端性能。

然后您可以将结果流式传输/缓冲回客户端。

这种方法仍然存在问题。当网络连接暂时中断时会发生什么?有人不小心关闭了浏览器,提供了Content-Length响应标头来帮助评估剩余时间,等等?更好的方法是:

异步

步骤可能如下:

  1. 客户端向服务器提交请求。
  2. 服务器启动异步进程(Web Worker或JMS)。
  3. 异步过程生成文件并将其临时存储在文件系统上。
  4. 该过程完成后,会向客户端发送电子邮件以提取其文件。这称为索赔检查。除了电子邮件,它还可以是返回的URL,用户可以刷新该URL以查看何时可以提取其文件。
  5. 在“合理的”时间内删除文件。

可以将该方法配置为允许自动恢复功能,并消除网络不确定性,并从公式中关闭浏览器选项卡。总体而言,这也减轻了必须处理重新请求的压力。还可以使用JMS,使您能够水平而不是垂直扩展此解决方案。