【问题标题】:How to return a lot of data from the database to a web client?如何将大量数据从数据库返回到 Web 客户端?
【发布时间】:2012-07-09 11:22:57
【问题描述】:

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

【问题讨论】:

  • 客户将数据用于什么目的?
  • 你可以做任何一种方式,取决于用例。
  • @SimonC:数据应该保存在本地文件中,用户可以保留它们以供检查等
  • 分批发送会减少响应时间;如果她/他长时间没有得到响应,客户可能会认为程序已损坏。但是,分批发送会增加流程的整体运行时间。这就是你应该考虑的。但是,很少会向客户端发送非常大量的数据。
  • 在浏览器客户端允许时使用 gzip 压缩过滤器。并做所有数据。您也可以通过电子邮件或云端传送查询结果,并在计时器上安排数据库任务。

标签: java database jakarta-ee tomcat web-applications


【解决方案1】:

我已经构建了类似的东西 - 这里有一些非常尴尬的问题,尤其是文件大小可能会超出您在浏览器中可以轻松处理的范围。随着数据量的增长,生成文件的时间也随之增加;这反过来又不是 Web 应用程序所擅长的,因此即使是少数访问者都请求大文件,您的 Web 服务器也会面临不满意的风险。

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

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

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

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

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

【讨论】:

    【解决方案2】:

    我们有一个类似的用例,其中包含大约 1 个 Oracle 集群。 40GB 的数据。最适合我们的解决方案是每个 select 语句的最大数据量,因为它显着减少了 DB 开销。

    话虽如此,有三个优化对我们来说效果很好:

    1.) 我们将数据分成 10 个大小大致相同的集合,并从数据库中并行选择它们。对于我们的集群,我们发现大约有 8 个并行工作的连接。比单个连接快 8 倍。最多 12 个连接有一些额外的加速,但这取决于您的数据库和您的 dba。

    2.) 远离休眠或其他 ORM,并在您谈论大量数据时使用定制的 JDBC。使用所有可以实现的优化(例如 ResultSet.setFetchSize())

    3.) 我们的数据压缩得非常好,将数据通过 gziper 可以节省大量 I/O 时间。在我们的例子中,它从关键路径中消除了 I/O。顺便说一句,将数据存储在文件中也是如此。

    【讨论】:

    • 对于(3)你是否在传递结果之前在服务器端压缩?
    • 数据通过OutputStreams 传输,服务器使用BufferedGzipOutputStreams 的组合(因此用CPU 周期换取I/O)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 2017-04-02
    • 2018-08-12
    相关资源
    最近更新 更多