我有一个表“类”,它链接到表“学生”和“教师”。一个“班级”通过外键关系链接到多个学生和教师。
当我使用休眠关联并获取大量实体(尝试 5000 个)时,我发现它占用的内存是我仅使用外键占位符的 4 倍。休眠关联有问题吗?
我可以使用任何内存分析器来找出占用过多内存的原因吗?
架构是这样的:
class(id,className)
student(id,studentName,class_id)
teacher(id,teacherName,class_id)
class_id is foreign key..
案例 #1 - Hibernate 关联
1)在 Class Entity 中,将学生和教师映射为:
@Entity
@Table(name="class")
public class Class {
private Integer id;
private String className;
private Set<Student> students = new HashSet<Student>();
private Set<Teacher> teachers = new HashSet<Teacher>();
@OneToMany(fetch = FetchType.EAGER, mappedBy = "classRef")
@Cascade({ CascadeType.ALL })
@Fetch(FetchMode.SELECT)
@BatchSize(size=500)
public Set<Student> getStudents() {
return students;
}
2)在学生和教师中,将班级映射为:
@Entity
@Table(name="student")
public class Student {
private Integer id;
private String studentName;
private Class classRef;
@ManyToOne
@JoinColumn(name = "class_id")
public Class getClassRef() {
return classRef;
}
使用的查询:
sessionFactory.openSession().createQuery("from Class where id<5000");
然而,这需要大量的内存。
案例 #2- 删除关联并单独获取
1)类实体中没有映射
@Entity
@Table(name="class")
public class Class {
private Integer id;
private String className;
2)只有学生,教师外键的占位符
@Entity
@Table(name="student")
public class Student {
private Integer id;
private String studentName;
private Integer class_id;
使用的查询:
sessionFactory.openSession().createQuery("from Class where id<5000");
sessionFactory.openSession().createQuery("from Student where class_id = :classId");
sessionFactory.openSession().createQuery("from Teacher where class_id = :classId");
注意 - 仅显示小鬼。部分代码。我正在通过 JAMM 库测量获取的实体的内存使用情况。
我还尝试将查询标记为 readOnly 在 case #1 中,如下所示,这并不能极大地提高内存使用率;只是很少。所以这不是解决办法。
Query query = sessionFactory.openSession().
createQuery("from Class where id<5000");
query.setReadOnly(true);
List<Class> classList = query.list();
sessionFactory.getCurrentSession().close();
以下是按大小排序的堆转储快照。看起来由休眠维护的实体正在造成问题..