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



我在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)

该表包含17050条记录,查询返回其中约3000条。

但是。。。这需要4分钟!!!

与SQL查询相比,执行时间缩短了许多倍。

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

这是关键部分从2048的结果移动到2049,整个执行时间变得非常非常长

有什么建议吗?

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

最新更新