gpt4 book ai didi

java - JPA EclipseLink 2 查询性能

转载 作者:行者123 更新时间:2023-11-30 06:36:24 24 4
gpt4 key购买 nike

应用和环境

Java EE/JSF2.0/JPA 企业应用程序,其中包含一个 Web 和一个 EJB 模块。我正在生成 PDF 文档,其中包含通过 JPA 查询的评估数据。

我使用 MySQL 作为数据库,所有表都使用 MyISAM 引擎。 JPA Provider 是缓存设置为 ALL 的 EclipseLink。 FetchType.EAGER 用于关系。

运行 NETBEANS PROFILER 之后

Profiler 结果显示,以下方法被调用的次数最多。在此 session 中,有 3858 次调用,从请求到响应大约需要 80 秒。这占用了 80% 的 CPU 时间。 Question 表中有 680 个条目。

public Question getQuestionByAzon(String azon) {
try {
return (Question) em.createQuery("SELECT q FROM Question q WHERE q.azonosito=:a").setParameter("a", azon).getSingleResult();
} catch (NoResultException e) {
return null;
}
}

问题实体:

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public abstract class Question implements Serializable {

private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(unique = true)
private String azonosito;
@Column(nullable = false)
@Basic(optional = false)
private String label;
@Lob
@Column(columnDefinition = "TEXT")
private String help;
private int quizNumber;
private String type;
@ManyToOne
private Category parentQuestion;

...

//getters and setters, equals() and hashCode() function implementations

}

有四个实体扩展问题

azonosito 列应该用作主键,但我不认为这是性能低下的主要原因。

我对优化建议感兴趣。如果您需要更多信息,请随时询问!

编辑查看我总结最佳结果的答案

提前致谢!

最佳答案

使用 LAZY 是一个好的开始,如果您非常关心性能,我建议您始终将所有内容设为 LAZY。

还要确保您使用的是编织(Java SE 代理、Java EE/Spring 或静态),因为 LAZY OneToOne 和 ManyToOne 依赖于此。

将 Id 更改为您的其他字段将是一个好主意,如果您总是查询它并且它是唯一的。您还应该检查为什么您的应用程序不断重复执行相同的查询。

您应该使查询成为 NameDQuery 而不是使用动态查询。在 EclipseLink 中,您还可以在查询上启用查询缓存(一旦它是命名查询),这将在查询结果上启用缓存命中。

关于java - JPA EclipseLink 2 查询性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4901374/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com