首页 > 代码库 > Hibernate学习笔记_性能优化
Hibernate学习笔记_性能优化
注意session.clear()的运用,尤其在不断分页循环的时候
a) 在一个大集合中进行遍历,遍历msg,取出其中的含有敏感字样的对象
b) 另外一种形式的内存泄露 ( //面试题:Java有内存泄漏吗?语法级别没有 但是可由java引起,例如:连接池不关闭,或io读取后不关闭)
1+N问题 (典型的面试题)
a) @ManyToOne(fetch=FetchType.LAZY)
//fetch=FetchType.LAZY 解决N+1问题 说明如下:
//当多对一(@ManyToOne)已经设定属性" fetch=FetchType.LAZY "时
//只有当需要时(如:t.getCategory().getName()时)才会去获取关联表中数据 可以解决N+1问题
b) @BatchSize
//@BatchSize 解决N+1问题 说明如下:
//在与查询表(此例中为Topic类)关联的表类(此例中为Category类)头处加@BatchSize(size=5)
//表示每次可查出5条记录 从而减少了select语句的个数
c) join fetch
//join fetch 解决N+1问题 说明如下:
//修改hql语句为--" from Topic t left join fetch t.category c "
d) QBC
//QBC(Query By Criteria) 解决N+1问题 说明如下:
//使用QBC的 createCriteria(*.class)执行查询 也可避免N+1问题
list和iterate不同之处(//主要为了面试 )
a) list取所有
@Test public void testQueryList() { Session session = sf.openSession(); session.beginTransaction(); //List<Topic> topics = (List<Topic>)session.createCriteria(Topic.class).list(); List<Category> categories = (List<Category>)session.createQuery("from Category").list(); for(Category c : categories) { System.out.println(c.getName()); } List<Category> categories2 = (List<Category>)session.createQuery("from Category").list(); for(Category c : categories2) { System.out.println(c.getName()); } session.getTransaction().commit(); session.close(); }
b) iterate先取 ID,等用到的时候再根据ID来取对象
@Test public void testQueryIterate() { Session session = sf.openSession(); session.beginTransaction(); //List<Topic> topics = (List<Topic>)session.createCriteria(Topic.class).list(); Iterator<Category> categories = (Iterator<Category>)session.createQuery("from Category").iterate(); while(categories.hasNext()) { Category c = categories.next(); System.out.println(c.getName()); } Iterator<Category> categories2 = (Iterator<Category>)session.createQuery("from Category").iterate(); while(categories2.hasNext()) { Category c = categories2.next(); System.out.println(c.getName()); } session.getTransaction().commit(); session.close(); }
c) session中list第二次发出,仍会到数据库査询
d) iterate 第二次,首先找session 级缓存
Hibernate学习笔记_性能优化