java - JPA EclipseLink 2 查询性能

标签 java performance jpa eclipselink

应用和环境

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

我使用 MySQL 作为数据库,所有表上都使用 MyISAM 引擎。 JPA 提供程序是 EclipseLink,其缓存设置为 ALLFetchType.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/

相关文章:

javascript - 是什么导致我的页面有如此多的绘制时间?

java - 谷歌应用程序引擎上的 JPA 类型 ("XXX")不是实体的实体,但需要用于此操作

java - Spring Boot 对无效请求的自定义错误响应

java - 如何访问 neo4j 非托管扩展上的节点属性

java - Android:收到对方的拨号号码

iOS:图像绘制性能

regex - 使用非贪婪限定符或前瞻更好吗?

java - 如何从实体管理器获取 ResultSetMetaData?

java - 如何使用连接获取的一个查询来获取父实体及其子实体及其子实体

JavaFX Hibernate 映射异常