OutputStream到分块响应

问题描述:

在Play 2.5应用程序中,我需要创建一个服务,在一个事务中从数据库中读取大量数据,并将其作为HTTP响应发送到客户端。OutputStream到分块响应

我不想使用背压,因为网络速度太慢会导致用于从数据库获取数据的数据库连接将被使用太长时间。

我的当前实现首先将数据提取到临时缓冲区(内存或文件,如果数据太多),释放数据库连接并返回带有数据的Ok响应。

这样做的缺点是,当从数据库中完全提取数据时,数据发送到客户端时首先启动。

我认为将数据提取到某种源代码会更好,如果数据量超过10kB,则会将所有数据缓存到内存和磁盘,但会立即将数据提供给分块响应。

我打算实现这一点,但我恐怕不会得到它的权利,并执行有关多线程,阻塞等

预先感谢任何提示,指导方针,现有开放实现的一些微妙的错误。 ..

如果您使用文件作为中间缓冲区,那么它可以作为“缓冲所有数据的源”。可以同时写入和读取文件(这在nix系统中是绝对正确的,不确定有关窗口)。因此,您可以使用数据库数据写入文件,并使用文件数据响应客户端。

当有请求进入时,您启动数据库查询并将输出append mode指向缓冲区文件。

在写入过程中,您同时将http响应发送回客户端,同时读取模式下文件提供的实体。

无需担心“关于多线程,阻塞等的细微错误”。因为你让操作系统和文件系统为你完成大部分工作。

+0

Thansk。我会尝试这种方法。但它仍然不理想。如果只有少量的数据,我想将所有内容都保存在内存中。另一个问题是,如果生产者比消费者慢并且在生产者设法写入所有数据之前到达文件的当前末尾,会发生什么? –

+0

@GregorRaýman不客气。关于“如果只有少量数据”,这与原本的问题“我需要创建读取大量数据的服务”相矛盾。如果产品比消费者慢,那很好,因为文件读取器会一直持续到EOF(这就是为什么所有文件读取器都有最低级别的io流)。 –

+0

谢谢拉蒙,我会试试这个方法。我遇到的问题是,我不知道是否会有少量数据(几kB)或大量数据(几十MB)。这就是为什么目前我开始缓冲内存中的数据并切换到文件,当它溢出配置的阈值。这是不理想的,因为存在延迟,并且如果消费者足够快,即使存在大量数据,也可以完全避免该文件。 –