我发现检索与其他对象有很多关系的多个对象实例时出现性能问题.我在MySQL中使用Spring和Hibernate的JPA实现.问题是,在执行JPA查询时,Hibernate不会自动连接到其他表.这导致n*r + 1个SQL查询,其中n是要检索的对象的数量,r是关系的数量.
例如,一个人住在一个地址,有很多爱好,并访问了许多国家:
@Entity
public class Person {
@Id public Integer personId;
public String name;
@ManyToOne public Address address;
@ManyToMany public Set<Hobby> hobbies;
@ManyToMany public Set<Country> countriesVisited;
}
Run Code Online (Sandbox Code Playgroud)
当我执行JPA查询以获取名为Bob的所有人员时,数据库中有100个Bobs:
SELECT p FROM Person p WHERE p.name='Bob'
Run Code Online (Sandbox Code Playgroud)
Hibernate将此转换为301个SQL查询:
SELECT ... FROM Person WHERE name='Bob'
SELECT ... FROM Address WHERE personId=1
SELECT ... FROM Address WHERE personId=2
...
SELECT ... FROM Hobby WHERE personId=1
SELECT ... FROM Hobby WHERE personId=2
...
SELECT ... FROM Country WHERE personId=1
SELECT ... FROM Country …Run Code Online (Sandbox Code Playgroud) 我想问一下,为了创建基于STRUTS2的高性能Web应用程序,我应该记住一切.保证该站点具有高流量(即假设每天约500,000个请求).还会有大量的数据库访问.
请评论,因为我决定使用以下框架(或建议任何更好的替代方案):
请提出一些性能调整/增强策略.谢谢!