【问题标题】:JPA: possible reason for high query execution timeJPA:查询执行时间长的可能原因
【发布时间】:2019-04-15 10:42:39
【问题描述】:

我有一个使用 JPA 查询的 Spring Boot 应用程序。直接在实时 Oracle DB 上执行相同的查询往往会在 20-40 毫秒内给出结果。另一方面,当我尝试使用该应用程序点击时,需要的时间从 1-2 秒到 50-60 秒不等。

我想了解这种行为的原因,以及它为什么会出现不可预测的行为。我们怀疑这可能是池中的线程数量有限,但后来在将应用程序与外部使用隔离后,现在只有一个用户表现出相同的行为。

查询应该以快速一致的方式执行。 我想知道这种行为背后的可能原因。

【问题讨论】:

  • 你在比较苹果和橘子。普通查询执行和 JPA 查询是您不能也不能比较的东西。后者涉及更多的事情,比如为每一行创建一个对象实例,可能执行另一个子查询来获取引用的数据。所以在不知道你的配置、你的实体、数据库结构的情况下,可能会有很多事情。
  • 如果 hibernate 是您的 JPA 提供者,您可以让它显示它实际用于与 DB 对话的 SQL——这可能有助于您了解其中的区别。将 <property name="hibernate.show_sql" value="false" /> 添加到您的 persistence.xml(或以其他方式设置此属性)。

标签: java hibernate jpa jpql


【解决方案1】:

它可以是任何东西,例如不可靠的网络、争用的数据库资源、JDBC 驱动程序配置错误或 JVM GC 暂停。尝试确定问题出在哪里:是 Java 客户端还是数据库服务器正在花费时间。

如果您怀疑问题出在数据库上,最好在数据库服务器端跟踪连接和 SQL 查询。这将为您提供最多的信息,例如查询执行计划。每个数据库都有自己的工具,例如Oracle 文档有entire chapter on Performing Application Tracing

【讨论】:

    【解决方案2】:

    一个可能的原因可能是您的实体关系 尝试启用休眠统计以获取更多详细信息:

    您可以通过以下方式启用:

    <persistence>
    <persistence-unit name="my-persistence-unit">
        ...
    
        <properties>
            <property name="hibernate.generate_statistics" value="true" />
    
            ...
        </properties>
    </persistence-unit>
    

    【讨论】:

      猜你喜欢
      • 2017-10-23
      • 1970-01-01
      • 2018-07-06
      • 1970-01-01
      • 2019-04-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多