【发布时间】:2017-03-30 18:32:47
【问题描述】:
我的项目基于 Java 8 并始终使用 Spring 我有一个服务,它返回一个包含 bean 列表的 bean。
这里是代码 API 方法
@RequestMapping(value = "/search",", produces = { MediaType.APPLICATION_JSON_VALUE }, method = RequestMethod.POST)
@ResponseBody
public DeferredResult<EmpAdvancedSearchPageBean> getSearch(
@RequestBody final EmpBean empBean) {
LOGGER.info("Pre getSearch");
EmpSearchPageBean searchPageBean = dataService.getSearch(empBean);
LOGGER.info("Post getSearch");
LOGGER.info("Pre set deffered result");
DeferredResult<EmpSearchPageBean> deferredResult = new DeferredResult<>();
deferredResult.setResult(searchPageBean);
LOGGER.info("Post set deffered result");
return deferredResult;
}
EmpSearchPageBean
public class EmpSearchPageBean implements java.io.Serializable {
private static final long serialVersionUID = 8085664391632415982L;
@JsonProperty("draw")
private Integer draw;
@JsonProperty("recordsTotal")
private Integer recordsTotal;
@JsonProperty("recordsFiltered")
private Integer recordsFiltered;
@JsonProperty("data")
private List<EmpSearch> data;
}
EmpSearch
public class EmpSearch implements java.io.Serializable {
private static final long serialVersionUID = -7665557350420327753L;
@JsonProperty("divisionDesc")
private String divisionDesc;
@JsonProperty("corpId")
private String corpId;
@JsonProperty("businessUnitDesc")
private String businessUnitDesc;
@JsonProperty("fdirName")
private String fdirName;
}
如果数据列表(List data;)包含 500 条记录 - 此服务在大约 2 秒内返回 但是,如果它包含大约 2000 条记录(这是一个常见用例),则最多可能需要 2 分钟才能返回
根据我的日志语句 - 从数据库返回此数据大约需要 2 秒,其余时间用于生成 json。
我使用的是 Spring Web 版本 4.3.3.RELEASE。 从调试日志中我可以看到它正在使用类 org.springframework.http.converter.json.MappingJackson2HttpMessageConverter
谁能提供我需要做什么才能成功渲染大量 json 数据的建议?
【问题讨论】:
-
您确定必须一次性返回 2k 条记录吗?第二个问题500条记录需要多少“几秒钟”;也许 4*"few seconds" = 2 分钟...
-
我不知道您是如何测量时间的,但是对于大量数据,您可以直接写入输出流,如果可以的话,可以从客户端读取。 (以 spring 为例,您可以使用
ResponseExtractor。) -
好吧,就像我说的,我不知道您是如何测量时间的...如果创建大型 JSON 需要太多时间,您可能需要将列表逐项写入输出流而不是整个对象的 JSON 字符串。
-
一个更简单的方法是忽略3个整数字段并返回列表,自定义
JsonSerializer可能不会改变任何东西,它会返回整个对象的JSON。 -
好吧,只是改变返回类型不会有任何作用,我的意思是一点一点地写入输出流(甚至手动刷新)。不过不管怎样,如果你能使用分页,那就更好了。
标签: java json spring performance spring-web