【问题标题】:Simple JPA findBy request takes 4 minutes vs 365 milliseconds of SQL Query简单的 JPA findBy 请求需要 4 分钟,而 SQL 查询需要 365 毫秒
【发布时间】:2020-07-19 23:37:40
【问题描述】:

我在 Spring Boot 应用程序中使用JpaRepository 接口来映射没有外键的表。

我的pom.xml 包含:

<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-tools</artifactId>
  <version>4.3.2.Final</version>
</dependency>

所以,我正在使用 Hibernate。

我的实体如下所示:

@Entity
@Table(name = "TABLE_NAME")
@NamedQuery(name = "CbmAnomalyDectOutput.findAll", query = "SELECT c FROM EntityName c")
public class EntityName implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @SequenceGenerator(name = "ID_GENERATOR", sequenceName = "MY_SEQ", allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "ID_GENERATOR")
    private long id;

    @Column(name = "ANOMALY_CLASS")
    private String anomalyClass;

    @Column(name = "ANOMALY_PROB")
    private BigDecimal anomalyProb;

    @Column(name = "ANOMALY_SEVERITY")
    private BigDecimal anomalySeverity;

等等!

我创建了方法findByAnomalyClass(String anomalyClass)

该表包含 17,050 条记录,查询返回大约 3,000 条记录。

但是...需要 4 分钟!!!

与SQL查询相比,执行时间要短很多倍。

编辑:我激活了一个非常详细的日志,我注意到对象org.hibernate.loader.Loader 是问题所在!它记录具有相同时间戳的 2048 行,然后是其他 145 行和其他行。

这是关键部分。 从 2048 年到 2049 年的结果集整体执行时间变得非常非常长!

有什么建议吗?

【问题讨论】:

  • 你为什么使用@NamedQueryJpaRepository 提供了一堆查询方法。
  • 这是完整的EntityName 类吗?你没有任何加入它@OneToManyfindByAnomalyClass方法是spring/jpa实现的还是你自己实现的?
  • 检查日志以查看执行的查询并添加完整的实体类
  • 很可能您使用fetch_size = 1 表示每条记录的往返。
  • @pero_hero:奇怪的是我的实体中没有连接。我尝试同时使用自动查询生成(按名称)和本机查询。

标签: java oracle hibernate spring-boot spring-data-jpa


【解决方案1】:
  1. 您需要确保 JPA 生成的查询是您所期望的。您可以将 JPA 配置为在日志文件中记录查询。
  2. 假设查询相同,我们可以预期响应时间大致相同。一个例外是当结果集行不在内存中时。在这种情况下,第一次查询执行需要在返回结果集之前从磁盘读入内存。
  3. 根据 Java 代码中结果集的处理方式,从数据库中检索结果集和使用该数据完成业务逻辑之间可能需要很长时间。您可以在调试会话中查看是否属于这种情况。

【讨论】:

  • 我激活了一个非常详细的日志,我注意到对象org.hibernate.loader.Loader 是问题所在!它记录具有相同时间戳的 2048 行,然后是其他 145 行和其他行。这是关键部分
猜你喜欢
  • 2020-08-22
  • 2014-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-18
相关资源
最近更新 更多