JPA映射的性能

时间:2012-04-30 06:59:18

标签: mysql performance hibernate jpa

现在我正在使用JPA。我想知道的是:

我有很多表相互映射。当我查看日志时,我看到在简单查询后从数据库中提取了大量信息。如果一次有很多查询会怎么样?或者它会正常工作吗?如何提高性能?

2 个答案:

答案 0 :(得分:1)

如果您确实有很多实体映射在一起,这确实可能导致性能问题。如果您有大量@OneToMany@ManyToMany映射,通常会出现这种情况:

@Entity
public class A {
    @OneToMany
    private List<B> listB;

    @ManyToMany
    private List<C> listC;

    @OneToMany
    private List<D> listD;
    ...
}

然而,你可以做的一件事就是使用延迟抓取。这意味着可能会延迟字段的加载,直到第一次访问该字段为止。您可以使用fetch属性

来实现此目的
@Entity
public class A {
    @OneToMany(fetch=FetchType.LAZY)
    private List<B> listB;

    @ManyToMany(fetch=FetchType.LAZY)
    private List<C> listC;

    @OneToMany(fetch=FetchType.LAZY)
    private List<D> listD;
    ...
}

在上面的示例中,它意味着listB,listC,listD将不会从DB中获取,直到第一次访问列表。

延迟提取的具体实现取决于您的JPA提供程序。

答案 1 :(得分:1)

ORM框架带来了开销。因为它的级别相当高,所以它有时需要生成大量的本机SQL查询,以便在一行或两行JPQL或纯EntityManager操作中为您提供所需的内容。

但是,JPA使用两个缓存 - L1和L2。一个在实体级别上运行,另一个在PersistenceUnits级别上运行。因此,您可能会看到生成了大量SQL查询,但过了一段时间后,您应该缓存一些数据。

如果您对性能不满意,可以尝试使用延迟加载的集合或自己获取所需的数据(您可能会对Bozho's post感兴趣)。

最后,如果您发现缓存未提高性能并且手工制作的JPQL查询没有正确执行工作 - 您始终可以恢复为纯SQL查询。请注意,这些查询会绕过JPA缓存,并且可能需要您在执行本机查询之前执行一些刷新(或在活动事务开始时调用它)。

尽管您选择了优化路线 - 首先在您的环境中测试并在您需要此优化时自行回答。做一些繁重的测试,性能测试等等。

“过早优化是万恶之源。” D. Knuth