现在我正在使用JPA。我想知道的是:
我有很多表相互映射。当我查看日志时,我看到在简单查询后从数据库中提取了大量信息。如果一次有很多查询会怎么样?或者它会正常工作吗?如何提高性能?
答案 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