java - 简单的 JPA findBy 请求需要 4 分钟,而 SQL 查询需要 365 毫秒

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

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

我的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 年,总体执行时间变得非常非常非常长!

有什么建议吗?

最佳答案

  1. 您需要确保 JPA 生成的查询是您期望的查询。您可以配置 JPA 以在日志文件中记录查询。
  2. 假设查询相同,我们可以预期响应时间大致相同。一个异常(exception)是当结果集行尚未在内存中时。在这种情况下,第一个查询执行需要在返回结果集之前从磁盘读取到内存中。
  3. 根据 Java 代码中结果集的处理方式,从数据库检索结果集和使用该数据完成业务逻辑之间可能需要很长的时间。您可以在调试 session 中查明是否存在这种情况。

关于java - 简单的 JPA findBy 请求需要 4 分钟,而 SQL 查询需要 365 毫秒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61085775/

相关文章:

java - Hibernate Criteria/Criterion with Restrictions 等于 POJO 的非空值

java - 搜索翻译的id时应该返回null还是-1?

sql - 如何在 LIKE 查询中使用破折号 (-) 字符

Python,引号中的引号

sql - 尽管语法不正确,Oracle脚本也不会产生错误。

java - 跨表单验证问题 Tapestry

java - 需要配置Spring Security和Hibernate

javascript - 禁用 displayTag 中的超链接

java - Google Appengine 端点的 Cron 作业

java - Hibernate映射子类忽略父类