应用和环境
Java EE/JSF2.0/JPA 企业应用程序,其中包含一个 Web 和一个 EJB 模块。我正在生成 PDF 文档,其中包含通过 JPA 查询的评估数据。
我使用 MySQL 作为数据库,所有表上都使用 MyISAM 引擎。 JPA 提供程序是 EclipseLink,其缓存设置为 ALL
。 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
}
有四个实体扩展Question
。
列 azonosito
应该用作主键,但我不认为这是性能低下的主要原因。
我对优化建议感兴趣。如果您需要更多信息,请随时询问!
编辑查看我总结最佳结果的答案
提前致谢!
最佳答案
使用 LAZY 是一个好的开始,如果您非常关心性能,我建议您始终将所有内容都设置为 LAZY。
还要确保您正在使用编织(Java SE 代理、Java EE/Spring 或静态),因为 LAZY OneToOne 和 ManyToOne 依赖于此。
如果您总是查询 ID 并且它是唯一的,则将 ID 更改为其他字段将是一个好主意。您还应该检查为什么您的应用程序不断重复执行相同的查询。
您应该将查询设置为 NameDQuery,而不是使用动态查询。 在 EclipseLink 中,您还可以在查询上启用查询缓存(一旦它是命名查询),这将启用对查询结果的缓存命中。
关于java - JPA EclipseLink 2 查询性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4901374/