【问题标题】:Spring and returning large volume of Json dataSpring并返回大量Json数据
【发布时间】: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


【解决方案1】:

决定重构代码以不返回尽可能多的 json 数据。 根据问题反馈尝试了多个建议,但没有获得所需的收益

【讨论】:

  • 恕我直言,这只是一些奇怪错误的解决方法。我的服务器在我的旧 i5-2400 @ 3.10GHz 上使用 Mysql+Hibernate+Gson+java.util.zip 在 300 毫秒内返回 4500 个项目(1.7 MB 未压缩)。那里没有超线性减速。
  • 如果 JSON 不是太复杂,您可以使用com.google.gson.stream.JsonWriter 自己构建它。这就是我正在做的,而且效果很好。我在i7-8650U @ 1.90GHz 上使用gson 的JsonWriter 在50-150ms 之间序列化和流回300KiB 的未压缩json。我不确定这与使用@JsonProperty 等进行自动序列化相比如何。
猜你喜欢
  • 1970-01-01
  • 2014-12-03
  • 2018-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多