如何处理大小超过2 MB的帖子数据

时间:2016-08-12 15:45:27

标签: java json java-ee jersey websphere

我有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数据的方法

4 个答案:

答案 0 :(得分:4)

分页不会解决您的问题,因为您要将数据发送到服务器,而不是接收。

你使用什么servlet容器?它看起来像默认的tomcat POST限制大小。

如果您使用的是独立的tomcat,则需要设置参数 连接器 maxPostSize see here或(here

答案 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?

Is Http POST limitless?

如果您担心服务器的性能。一种可能的选择是逻辑拆分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重新合并并处理请求并发回适当的响应。如果是第二种情况,则性能没有太大提升。