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

Retrieve large amount of data in Java Web App and download it to client

鉴于:

问题:

如何使用户能够通过客户端硬盘驱动器上的 Web 应用程序从数据库下载如此大的数据导出而不会出现 OutOfMemory Exceptions/storing/buffering 服务器上的完整数据

您可能会 运行 尝试在单个 HTTP 请求中执行此操作。

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

流媒体

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

然后您可以stream/buffer将结果返回给客户端。

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

异步

步骤可以是这样的:

  1. 客户端向服务器提交请求。
  2. 服务器启动异步进程(网络工作者或 JMS)。
  3. 异步进程生成文件并将其临时存储在文件系统上。
  4. 流程完成后,它会向客户发送一封电子邮件以获取他们的文件。这称为索赔检查。它也可以是返回的 URL,而不是电子邮件,然后用户可以刷新以查看他们的文件何时可以提取。
  5. 经过“合理的”时间后,文件将被删除。

此方法可以配置为允许 auto-resume 功能并消除网络不确定性和浏览器选项卡关闭等式。总的来说,它还减轻了必须处理 re-requests 的压力。还使用 JMS,使您能够水平而不是垂直扩展此解决方案。