Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在Spring中使用RestController返回4MB的JSON时会出现性能问题_Json_Spring_Performance_Spring Boot_Controller - Fatal编程技术网

为什么在Spring中使用RestController返回4MB的JSON时会出现性能问题

为什么在Spring中使用RestController返回4MB的JSON时会出现性能问题,json,spring,performance,spring-boot,controller,Json,Spring,Performance,Spring Boot,Controller,我有一个应用程序使用SpringBoot+JPA/Hibernate(使用的数据库是PostGresDB)。 我有一个返回JSONArray的控制器方法。阵列的大小已达到3.4MB。我注意到,在检索此JSONArray时,客户端需要30-35秒才能完成请求。我检查了生成的查询,查询本身在500毫秒内完成,因此DB不是一个真正的问题。 我想~4MB的数据太多了吧?我没有太多的经验,所以我想知道这是否需要这么长时间。这是一个在AWS上运行的Web服务,运行在堆叠的机器上 任何关于调试的故障排除步骤或

我有一个应用程序使用SpringBoot+JPA/Hibernate(使用的数据库是PostGresDB)。 我有一个返回JSONArray的控制器方法。阵列的大小已达到3.4MB。我注意到,在检索此JSONArray时,客户端需要30-35秒才能完成请求。我检查了生成的查询,查询本身在500毫秒内完成,因此DB不是一个真正的问题。 我想~4MB的数据太多了吧?我没有太多的经验,所以我想知道这是否需要这么长时间。这是一个在AWS上运行的Web服务,运行在堆叠的机器上


任何关于调试的故障排除步骤或见解或我应该做的明显事情。我曾考虑过对回复进行分页,但如果可能的话,我希望避免这样做。没想到3.4MB那么大。

后端的信息是如何形成的?是否涉及联接/多个表?尝试发送4MB的静态数据作为测试,看看效果如何?(要做到这一点,您可能需要制作一个假的REST端点,但如果您能够获得JSON,您应该能够将其保存到文件或其他文件中)


您还可以在代码中放置计时器,或者使用JVisualVM之类的工具连接到正在运行的进程并收集方法计时信息。如果问题出现在java代码或其运行时依赖项中,那么在这里查看“方法自时间”度量可能很有用。

后端的信息是如何形成的?是否涉及联接/多个表?尝试发送4MB的静态数据作为测试,看看效果如何?(要做到这一点,您可能需要制作一个假的REST端点,但如果您能够获得JSON,您应该能够将其保存到文件或其他文件中)


您还可以在代码中放置计时器,或者使用JVisualVM之类的工具连接到正在运行的进程并收集方法计时信息。如果问题出现在java代码或其运行时依赖项中,那么查看“方法自时间”指标可能会很有用。

首先,我要检查hibernate是否是瓶颈。您可以通过在一些日志代码中包装后端调用来测试这一点,请参见下面的代码

@RequestMapping("api")
public SomeObject getSomeObject() {
    long start = System.currentTimeMillis();

    // call the method that gets the object via JPA

    System.out.println("Got all results in '" + (System.currentTimeMillis() - start) / 1000 + "' seconds");
}

如果它输出的结果大于30秒,那么您就知道hibernate是您的瓶颈。如果是这种情况,则需要执行一些分页以限制返回到客户端的结果。

首先,我要检查hibernate是否是瓶颈。您可以通过在一些日志代码中包装后端调用来测试这一点,请参见下面的代码

@RequestMapping("api")
public SomeObject getSomeObject() {
    long start = System.currentTimeMillis();

    // call the method that gets the object via JPA

    System.out.println("Got all results in '" + (System.currentTimeMillis() - start) / 1000 + "' seconds");
}
如果它输出的结果大于30秒,那么您就知道hibernate是您的瓶颈。如果是这种情况,则需要执行一些分页,以限制返回到客户端的结果