检索 Java Web App 中的大量数据并下载到客户端
Retrieve large amount of data in Java Web App and download it to client
鉴于:
- websphere 上的 Web 应用程序 运行 和具有大表
的 oracle 数据库
- 一个 jsf 网站,允许用户下载 csv 文件中的部分数据。
- 访问数据库的正常方式是通过 JPA (openJPA)
- 潜在的文件下载大小可达 500MB 到 1GB
问题:
如何使用户能够通过客户端硬盘驱动器上的 Web 应用程序从数据库下载如此大的数据导出而不会出现 OutOfMemory Exceptions/storing/buffering 服务器上的完整数据
您可能会 运行 尝试在单个 HTTP 请求中执行此操作。
流式处理和异步处理是两种可能的解决方案。
流媒体
看起来像JPA 2.2 has added streaming support。为防止出现内存不足的情况,您可能需要调整 JVM,您还可能需要调整 JDBC 提取大小以平衡数据库性能和客户端性能。
然后您可以stream/buffer将结果返回给客户端。
虽然这种方法存在问题。当网络连接暂时中断时会发生什么?有人不小心关闭了他们的浏览器,提供 Content-Length 响应 headers 来帮助计算剩余时间等等?更好的做法是:
异步
步骤可以是这样的:
- 客户端向服务器提交请求。
- 服务器启动异步进程(网络工作者或 JMS)。
- 异步进程生成文件并将其临时存储在文件系统上。
- 流程完成后,它会向客户发送一封电子邮件以获取他们的文件。这称为索赔检查。它也可以是返回的 URL,而不是电子邮件,然后用户可以刷新以查看他们的文件何时可以提取。
- 经过“合理的”时间后,文件将被删除。
此方法可以配置为允许 auto-resume 功能并消除网络不确定性和浏览器选项卡关闭等式。总的来说,它还减轻了必须处理 re-requests 的压力。还使用 JMS,使您能够水平而不是垂直扩展此解决方案。
鉴于:
- websphere 上的 Web 应用程序 运行 和具有大表 的 oracle 数据库
- 一个 jsf 网站,允许用户下载 csv 文件中的部分数据。
- 访问数据库的正常方式是通过 JPA (openJPA)
- 潜在的文件下载大小可达 500MB 到 1GB
问题:
如何使用户能够通过客户端硬盘驱动器上的 Web 应用程序从数据库下载如此大的数据导出而不会出现 OutOfMemory Exceptions/storing/buffering 服务器上的完整数据
您可能会 运行 尝试在单个 HTTP 请求中执行此操作。
流式处理和异步处理是两种可能的解决方案。
流媒体
看起来像JPA 2.2 has added streaming support。为防止出现内存不足的情况,您可能需要调整 JVM,您还可能需要调整 JDBC 提取大小以平衡数据库性能和客户端性能。
然后您可以stream/buffer将结果返回给客户端。
虽然这种方法存在问题。当网络连接暂时中断时会发生什么?有人不小心关闭了他们的浏览器,提供 Content-Length 响应 headers 来帮助计算剩余时间等等?更好的做法是:
异步
步骤可以是这样的:
- 客户端向服务器提交请求。
- 服务器启动异步进程(网络工作者或 JMS)。
- 异步进程生成文件并将其临时存储在文件系统上。
- 流程完成后,它会向客户发送一封电子邮件以获取他们的文件。这称为索赔检查。它也可以是返回的 URL,而不是电子邮件,然后用户可以刷新以查看他们的文件何时可以提取。
- 经过“合理的”时间后,文件将被删除。
此方法可以配置为允许 auto-resume 功能并消除网络不确定性和浏览器选项卡关闭等式。总的来说,它还减轻了必须处理 re-requests 的压力。还使用 JMS,使您能够水平而不是垂直扩展此解决方案。