java - 如何从数据库中返回大量数据给网页客户端?

标签 java database jakarta-ee tomcat web-applications

我有以下问题:
我有一个将数据存储在数据库中的 Web 应用程序。我希望客户能够提取数据,例如2 个表到一个文件(客户端本地)。
数据库可以任意大(这意味着我不知道数据库中可能有多少数据。可能很大)。
最好的方法是什么?
是否应该将所有数据从表中SELECT并作为单个结构返回给客户端以存储在文件中?
或者应该分部分检索数据,例如前 100 个然后下 100 个条目等并在客户端中创建单一结构?
这里有什么利弊要考虑吗?

最佳答案

我已经构建了类似的东西 - 这里有一些非常棘手的问题,特别是当文件大小可以增长到超出浏览器可以轻松处理的范围时。随着数据量的增长,生成文件的时间也会增加;这反过来又不是 web 应用程序擅长的,因此您冒着 web 服务器对即使是少量访问者都请求大文件不满意的风险。

我们所做的是将应用程序分成 3 个部分。

“文件请求”是一个简单的网页,经过身份验证的用户可以在其中请求他们的文件。这将在网页请求上下文之外启动第二部分:

文件生成器。 在我们的例子中,这是一个 Windows 服务,它查看包含文件请求的数据库表,选择最新的一个,运行适当的 SQL 查询,将输出写入 CSV 文件,并压缩该文件,然后将其移动到输出目录并通过链接邮寄给用户。它设置数据库中记录的状态,以确保在任何一个时间点只发生一个过程。

FTP/WebDAV 站点: ZIP 文件被写入一个可通过 FTP 和 WebDAV 访问的文件夹 - 这些协议(protocol)往往比标准 HTTP 下载更好地处理大文件。

这非常有效 - 用户不喜欢等待他们的文件,但延迟很少超过几分钟。

关于java - 如何从数据库中返回大量数据给网页客户端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11394075/

相关文章:

java - 模拟单元测试用例的网络响应

java - 使用 Java Time API 获取以月为单位的年龄

java - BufferedImage 数组的值集显示为 null

Android 日期查询无法正常工作

java - 多线程检查映射大小和并发性

java - Ant 文件,包含另一个文件

java - AI 在 Java 游戏中每 n 秒执行一次随机 Action

java - 鱼眼中的哪个类/jar 文件 Hook 到 subversion 和 GIT?

mysql - 在 HSQLDB 中选择 UUID()

database - Neo4j 密码 : Find common nodes between a set of matched nodes