我正在创建一个Java Rest Web服务,它以JSON格式提供大型报告。这可以大到几百万行。实现Web服务的最佳方式是什么,它将有效地将这些大数据作为响应发送给客户端。因为我无法在内存中将记录集转换为JSON,因为它会在GC上创建负载。
答案 0 :(得分:1)
这完全取决于上下文:)
如果您将数据作为JSON提供(并假设您是“jersey”标签),我建议将您的对象(报告行)包装到实现分页功能的结构中。
{
"current-page" : (num),
"max-pages" : (numOfAllPages),
"rows" : [{
{(row1)}, {(row2)}, {(row...n)},
}]
}
并且您的REST处理程序接受QueryString参数,如:?page =(num)
除非,您需要一次发送所有行。如果您这样做 - 我建议您直接写入响应流,为用户设置正确的响应标头以触发“下载”操作。
答案 1 :(得分:1)
解决方案很少 首先是Miron指出的Paginate。
第二个Chunky输出 你使用ChunkyOutput课程发送它。在此,您的客户还需要使用ChunkyInput
@Path("/chunkyresource")
public class ResourceSentAsChunks {
@GET
public ChunkedOutput<String> chunkedGet() {
System.out.println("ResourceSentAsChunks.chunkedGet()");
final ChunkedOutput<String> output = new ChunkedOutput<String>(String.class);
new Thread() {
@Override
public void run() {
try {
for (int i = 0; i < 100000; i++) {
output.write(i + " ");
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
output.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}.start();
return output;
}
如果您可以将回复作为附件发送,或者您拥有自己的客户端应用程序,则第三次使用压缩。这种技术在图像的情况下使用相当广泛。