【问题标题】:Why there is performance issues when returning JSON with RestController in Spring for 4MB为什么在 Spring 中使用 RestController 返回 JSON 4MB 时会出现性能问题
【发布时间】:2019-04-11 22:49:40
【问题描述】:

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

任何故障排除步骤或关于调试的见解或我应该做的明显事情。我研究了对响应进行分页,但如果可能的话想避免这种情况。没想到 3.4MB 这么大。

【问题讨论】:

    标签: json spring performance spring-boot controller


    【解决方案1】:

    信息是如何在后端形成的?是否涉及 JOIN/多个表?尝试发送 4 MB 静态数据作为测试,看看效果如何? (您可能需要制作一个假的 REST 端点来执行此操作,但如果您可以获取 JSON,您应该能够将其保存在文件或其他东西中)。

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

    【讨论】:

      【解决方案2】:

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

      @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 秒,那么您知道休眠是您的瓶颈。如果是这种情况,那么您需要执行一些分页来限制您返回给客户端的结果。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-10-23
        • 2019-09-08
        • 1970-01-01
        • 1970-01-01
        • 2015-12-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多