如何处理 post 大小超过 2 mb 的数据
How to handle post data of size more than 2 mb
我有 json post 具有以下模板的数据
{
"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
}
当 post 数据小于 2 MB 时工作正常,但如何处理大于 2 MB 的数据。
问题
1) 我应该使用分页吗?
2) 如果我将 json 分成两半,那么每一半都将无效 json。那么,我应该在服务器端接受字符串并连接吗?
3) 有什么很好的例子可以处理这种情况
4) 寻找可以处理 json 大小小于或大于 2 MB 的数据的方法
2MB 相当小,我认为将 json 文件作为多部分上传,然后正常处理 json 文件的方法最多可以处理 50MB 大小的文件。可以找到处理文件上传的示例 here.
对于json个超过百MB的文件,我们必须想办法在流中处理,或者将文件拆分成更小的文件。
分页将是不错的选择,但需要手动干预。
取而代之的是,您可以发送多个异步请求来获取数据(即,在一个请求中获取 1-200 条记录,下一个请求将获取 200-400 条记录),但不推荐这样做,因为您的服务器将根据记录数。
分页不会解决您的问题,因为您正在向服务器发送数据,而不是接收数据。
您使用什么 servlet 容器?看起来像默认 tomcat POST 限制大小。
如果您使用的是单机版 tomcat 您需要设置参数
您的连接器的maxPostSize:see here or (here)
Json 文件非常适合压缩。你应该考虑一下。
是的,您应该使用分页。但是会有一些缺点。比如一致性。
您应该以不分成字符串的方式发送它们。我建议你发送有意义的数据。所以分页将是有意义的。如果消息的一部分(块)丢失,您应该只重新发送该部分。不是全部。
"how can you eat a really big fish? - by slicing thin"。
尝试 post 更小且有意义的部分。否则你的服务器将需要更多的计算时间来处理数据,你的客户端需要更多的内存来处理。
您有什么理由不在一个请求中发送数据吗?将 50MB 作为一个请求发送。 JSON 或 HTTP post 规范中的数据大小没有限制,如以下 SO 问题
中所述
Is there a limit on how much JSON can hold?
如果您担心服务器的性能。一种可能的选择是从逻辑上拆分 json,以便可以在较小的块中执行操作。
例如,考虑到您的表数组中有 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 合并回一起并处理请求并发回正确的响应。如果是第二种情况,性能提升不大。
我有 json post 具有以下模板的数据
{
"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
}
当 post 数据小于 2 MB 时工作正常,但如何处理大于 2 MB 的数据。
问题
1) 我应该使用分页吗?
2) 如果我将 json 分成两半,那么每一半都将无效 json。那么,我应该在服务器端接受字符串并连接吗?
3) 有什么很好的例子可以处理这种情况
4) 寻找可以处理 json 大小小于或大于 2 MB 的数据的方法
2MB 相当小,我认为将 json 文件作为多部分上传,然后正常处理 json 文件的方法最多可以处理 50MB 大小的文件。可以找到处理文件上传的示例 here.
对于json个超过百MB的文件,我们必须想办法在流中处理,或者将文件拆分成更小的文件。
分页将是不错的选择,但需要手动干预。 取而代之的是,您可以发送多个异步请求来获取数据(即,在一个请求中获取 1-200 条记录,下一个请求将获取 200-400 条记录),但不推荐这样做,因为您的服务器将根据记录数。
分页不会解决您的问题,因为您正在向服务器发送数据,而不是接收数据。
您使用什么 servlet 容器?看起来像默认 tomcat POST 限制大小。
如果您使用的是单机版 tomcat 您需要设置参数 您的连接器的maxPostSize:see here or (here)
Json 文件非常适合压缩。你应该考虑一下。
是的,您应该使用分页。但是会有一些缺点。比如一致性。
您应该以不分成字符串的方式发送它们。我建议你发送有意义的数据。所以分页将是有意义的。如果消息的一部分(块)丢失,您应该只重新发送该部分。不是全部。
"how can you eat a really big fish? - by slicing thin"。
尝试 post 更小且有意义的部分。否则你的服务器将需要更多的计算时间来处理数据,你的客户端需要更多的内存来处理。
您有什么理由不在一个请求中发送数据吗?将 50MB 作为一个请求发送。 JSON 或 HTTP post 规范中的数据大小没有限制,如以下 SO 问题
中所述Is there a limit on how much JSON can hold?
如果您担心服务器的性能。一种可能的选择是从逻辑上拆分 json,以便可以在较小的块中执行操作。
例如,考虑到您的表数组中有 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 合并回一起并处理请求并发回正确的响应。如果是第二种情况,性能提升不大。