首页 > 解决方案 > 在 Java Web App 中检索大量数据并将其下载到客户端

问题描述

鉴于:

问题:

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

标签: javaoraclejsflarge-files

解决方案


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

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

流媒体

看起来JPA 2.2 增加了流媒体支持。为了防止出现内存不足的情况,您可能需要调整 JVM,还可能需要调整 JDBC 提取大小以平衡数据库性能和客户端性能。

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

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

异步

这些步骤可能是这样的:

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

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


推荐阅读