【问题标题】:JPA query getting slower on each loop iteration in tomcat在tomcat中的每次循环迭代中,JPA查询变慢
【发布时间】:2020-01-12 15:08:28
【问题描述】:

我有一个简单的选择查询,它返回 200 行。该查询被迭代 1437 次。 技术:java 8、spring boot 2.1.3.RELEASE、tomcat、hibernate

在每次迭代中,查询都会变慢。第一个查询需要 55 毫秒,最后一个查询需要 702 毫秒
但是,当我在 Junit "@RunWith(SpringJUnit4ClassRunner.class)" 中启动相同的查询时,查询并没有变慢。每个查询需要 +- 37 毫秒

在Tomcat中运行时的第一个和最后一个日志

运行junit时的第一个和最后一个日志

【问题讨论】:

  • 请提供代码;这将帮助我们帮助您。缺少代码导致大量猜测......

标签: java hibernate spring-boot jpa tomcat


【解决方案1】:

正如您在日志中看到的,一个区别是实体管理器在 Tomcat 上的每次迭代后都不会关闭(但在 JUnit 上会关闭)。在 1k 次迭代之后,实体管理器将在内存中保存大量对象,并且在这种加载的上下文上的操作变得昂贵。每次迭代的内存压力也应该越来越高。

我会尝试更频繁地clear 上下文(即在每次迭代之后),或者至少增加可用内存以排除 GC 过于频繁地发挥作用。

另见this answer

【讨论】:

    【解决方案2】:

    我在每次查询后添加了 entitymanager.clear(),这解决了问题。 谢谢级联!!

    结果确实令人印象深刻。第一个查询需要 73 毫秒,而对于最后一个查询,它会以相反的方式“下降”到 1 毫秒

    【讨论】:

      猜你喜欢
      • 2015-05-18
      • 2020-01-05
      • 2011-08-16
      • 2011-10-11
      • 2018-03-15
      • 2021-11-03
      • 2018-05-23
      • 2017-04-28
      • 2021-12-08
      相关资源
      最近更新 更多