【发布时间】: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 年的结果集整体执行时间变得非常非常长!
有什么建议吗?
【问题讨论】:
-
你为什么使用
@NamedQuery?JpaRepository提供了一堆查询方法。 -
这是完整的
EntityName类吗?你没有任何加入它@OneToMany?findByAnomalyClass方法是spring/jpa实现的还是你自己实现的? -
检查日志以查看执行的查询并添加完整的实体类
-
很可能您使用fetch_size = 1 表示每条记录的往返。
-
@pero_hero:奇怪的是我的实体中没有连接。我尝试同时使用自动查询生成(按名称)和本机查询。
标签: java oracle hibernate spring-boot spring-data-jpa