java - JPA 查询在 tomcat 中的每次循环迭代中变慢

标签 java hibernate spring-boot jpa tomcat

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

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

在Tomcat中运行时的first和last的日志

first query

last query

运行junit时的first和last日志

first query

last query

最佳答案

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

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

另见 this answer

关于java - JPA 查询在 tomcat 中的每次循环迭代中变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57877902/

相关文章:

java - hibernate的 "property-ref"元素标签中的 "one-to-one"属性有什么作用?

java - spring.io 中的 Spring Cloud 配置示例不起作用

java - 在键和值中转义 JSON 的双引号?

java - picasso 图书馆无法解决

java.lang.ArrayIndexOutOfBoundsException at oracle.jdbc.driver.T4CTTIrxd.readBitVector(T4CTTIrxd.java :135)

java - 为什么Hibernate 5.0.6 发布包中不包含事务实现jar?

java - PowerMock 有什么好的替代品吗?

java - CountDownLatch 导致 JFrame(JButtons 等)中的内容消失,并且仅在鼠标悬停时才返回

java - 带有自定义分隔符的 Spring AntPathMatcher 表现得很奇怪

spring - 升级到 Spring Boot 1.3 导致 java.lang.NoSuchMethodError : org. springframework.beans.factory.config.ConfigurableBeanFactory.getSingletonMutex()