在Play 2.5应用程序中,我需要创建一个服务,该服务在一个事务中从数据库中读取大量数据,并将其作为HTTP响应发送给客户端。
我不想使用背压,因为网络速度慢可能会导致用于从数据库获取数据的数据库连接使用时间过长。
我当前的实现首先将数据提取到临时缓冲区(内存或文件,如果数据太多),释放数据库连接并返回带有数据的Ok响应。
这样做的缺点是,当数据完全从数据库中提取时,首先将数据发送到客户端。
我认为最好将数据提取到某种Source,如果超过10kB,它会将所有数据缓冲到内存和磁盘,但它会立即将数据提供给分块响应。
我打算实现这一点,但我担心我不会做对,并实现一些关于多线程,阻塞等的微妙错误。
提前感谢任何提示,指南,现有的开放式实施......
答案 0 :(得分:1)
如果您使用文件作为中间缓冲区,那么它可以作为“缓冲所有数据的源”。文件可以同时写入和读取(这在* nix系统中肯定是正确的,不确定窗口)。因此,您可以使用数据库数据写入文件,并使用文件数据响应客户端。
当您收到请求时,请启动数据库查询并将append mode中的输出定向到缓冲区文件。
在写入过程中,您同时将http响应发送回客户端,实体由读取模式下的文件提供。
无需担心“关于多线程,阻塞等的细微错误”因为你让操作系统和文件系统为你完成大部分工作。