0

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

4

2 回答 2

1

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

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

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

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

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

这工作得很好——用户不喜欢等待他们的文件,但延迟很少超过几分钟。

于 2012-07-09T13:15:43.640 回答
0

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

话虽如此,有三个优化对我们来说非常有效:

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

2.) 一旦您谈到大量数据,请远离休眠或其他 ORM,并使用定制的 JDBC。使用所有可以达到的优化(例如 ResultSet.setFetchSize())

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

于 2012-07-09T12:54:16.010 回答