我有一个返回 200 行的简单选择查询。查询迭代了 1437 次。 技术:java 8、spring boot 2.1.3.RELEASE、tomcat、hibernate
在每次迭代中,查询都会变慢。第一个查询耗时 55ms,最后一个查询耗时 702ms
但是,当我在 Junit "@RunWith(SpringJUnit4ClassRunner.class)"中启动相同的查询时,查询并没有变慢。每个查询花费 +- 37 毫秒
在Tomcat中运行时的first和last的日志
运行junit时的first和last日志
最佳答案
如您在日志中所见,一个区别是实体管理器在 Tomcat 上的每次迭代后都没有关闭(但在 JUnit 上关闭)。在 1k 次迭代之后,实体管理器将在内存中保存大量对象,并且在这样一个加载的上下文上的操作变得昂贵。在每次迭代期间内存压力也应该越来越高。
我会尝试 clear更频繁地(即在每次迭代之后)上下文或至少增加可用内存以排除 GC 过于频繁地发挥作用。
另见 this answer
关于java - JPA 查询在 tomcat 中的每次循环迭代中变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57877902/