我有json发布数据与下面的模板
{
"themeId" : JSONString,
"themeName" : JSONString,
"tables" : [{
"tableName" : JSONString,
"records" : [{
"recordVersion" : JSONString,
"tableItems" : []
}]
}]
}
在Java方面,我有这样的REST API:
@POST
@Path("/{themeId}")
@Consumes({MediaType.APPLICATION_JSON})
public Response postTheme( @PathParam("themeId") String themeId, ThemeDictionary dictionary) throws InterruptedException {
//code to handle
}
当发布数据小于2 MB但如何处理大于2 MB的数据时,它工作正常。
问题
1)我应该选择分页。
2)如果我将json分成两半,那么每一半都不会成为有效的json。那么,我应该接受字符串并在服务器端连接吗?
3)是否有任何好的例子来处理这种情况
4)寻找可以处理大小小于或大于2 MB的json数据的方法
答案 0 :(得分:4)
分页不会解决您的问题,因为您要将数据发送到服务器,而不是接收。
你使用什么servlet容器?它看起来像默认的tomcat POST限制大小。
答案 1 :(得分:2)
2MB相当小,我认为将json文件作为multipart上传的方法,然后通常处理json文件可以处理最大50MB大小的文件。可以找到处理文件上传的示例here。
对于超过百MB的json文件,我们必须找到一些在流式传输中处理的方法,或者将文件拆分成较小的文件。
答案 2 :(得分:1)
Json文件非常适合压缩。你应该考虑一下。
是的,你应该选择分页。但是会有一些缺点。如一致性。
你应该通过不分成字符串来发送它们。我建议你发送有意义的数据。因此分页将是有意义的。如果缺少消息的某个部分(块),则只应重新发送该部分。不是所有部分。
“你怎么能吃一条真正的大鱼? - 切成薄片”。尝试发布更小的&有意义的部分否则,您的服务器将需要更多的计算时间来处理数据,您的客户需要更多的内存来处理。
答案 3 :(得分:1)
您是否有任何理由不在一个请求中发送数据?发送50MB作为一个请求。 JSON或HTTP post规范中的数据大小没有限制,如下面的SO问题所述
Is there a limit on how much JSON can hold?
如果您担心服务器的性能。一种可能的选择是逻辑拆分json,以便可以在较小的块中执行操作。
例如,考虑你的tables数组中有200个项目你可以考虑将表数组拆分成更小的块,也就是说每个请求50/20。
{
"totalPages":2,
"themeId" : JSONString,
"themeName" : JSONString,
"tables" : [{
//first 50 tables
"tableName" : JSONString,
"records" : [{
"recordVersion" : JSONString,
"tableItems" : []
}]
}]
}
下一个请求
{
"totalPages":2,
"themeId" : JSONString,
"themeName" : JSONString,
"tables" : [{
//next 50 tables
"tableName" : JSONString,
"records" : [{
"recordVersion" : JSONString,
"tableItems" : []
}]
}]
}
如果您不需要处理请求的完整数据,则可以在数据到达时对数据执行操作。如果没有,则将表数组添加到某个db / file / memory,直到收到最后一页,对于最后一个请求,将json重新合并并处理请求并发回适当的响应。如果是第二种情况,则性能没有太大提升。