大型数据集的Jersey Streaming输出

时间:2018-07-24 17:06:52

标签: java rest web-services jersey

final StreamingOutput stream = new StreamingOutput() {
  @Override
  public void write(final OutputStream out) {
  dao.getData(
    query,
    new SdmxObserver(writerFactory.getDataWriter(sdmxFormat, out, properties), request
        .getRemoteAddr(), request.getHeader("User-Agent"), query.toString(), sdmxFormat
        .toString(), query.getlist()));
  }
};
res = Response.ok(stream, MediaType.valueOf("application/vnd.sdmx.genericdata+xml;version=2.1"))
            .cacheControl(cc).lastModified(lastModified).header("Vary", "Accept,Accept-Encoding").build();
return res;

数据库调用检索数据的时间很长,因为数据量很大,为此,在将数据下载到浏览器中之前,这需要很长时间,并且用户认为服务器无法访问。我们如何在同一个Web服务响应中使用多个数据库查询来发送数据块,以使下载快速启动并在下一个查询从数据库中获取数据时继续添加响应。

1 个答案:

答案 0 :(得分:1)

将响应内容分页到最多X条记录。这样一来,API一次就能一次检索一页结果。

http://localhost/api/v1/resource?page=1&size=20
http://localhost/api/v1/resource?page=2&size=20
http://localhost/api/v1/resource?page=3&size=20
...

在定义API时,您可以查看Spring Data中定义的PageRequestPageable