传智播客Hibernate视频教程学习笔记53
2009-08-08 19:42
369 查看
iterate查询与N+1次查询的问题
test.java
执行结果:
Hibernate: insert into Users (ver, name, birthday) values (?, ?, ?)
Hibernate: insert into Users (ver, name, birthday) values (?, ?, ?)
Hibernate: insert into Users (ver, name, birthday) values (?, ?, ?)
Hibernate: select users0_.id as col_0_0_ from Users users0_
Hibernate: select users0_.id as id0_0_, users0_.ver as ver0_0_, users0_.name as name0_0_, users0_.birthday as birthday0_0_ from Users users0_ where users0_.id=?
pf1
Hibernate: select users0_.id as id0_0_, users0_.ver as ver0_0_, users0_.name as name0_0_, users0_.birthday as birthday0_0_ from Users users0_ where users0_.id=?
pf2
Hibernate: select users0_.id as id0_0_, users0_.ver as ver0_0_, users0_.name as name0_0_, users0_.birthday as birthday0_0_ from Users users0_ where users0_.id=?
pf3
可以发现红色那条语句,iterator查询是先查出记录的id号,在需要的时候再去查询,查询时候先从缓存里查找,再从数据库中读取。
由于我的Users是native方式生成主键,所以不会保存在缓存里,因为没访问数据库前不知道数据库生成的id号。
所有的select语句加起来是4条,包括查id的语句,所以一共是N+1次查询。所以缓存没命中的情况下查询效率极低。
同样懒加载的时候也会有N+1次查询的情况,第一次查询出所有当前对象,N次查询查询关联对象。
test.java
import hibernate.HibernateUtil; import java.util.Date; import java.util.Iterator; import org.hibernate.Query; import org.hibernate.Session; import domain.Users; public class test { public static void main(String[] args) { Users user = new Users(); user.setBirthday(new Date()); user.setName("pf1"); HibernateUtil.add(user); user.setName("pf2"); HibernateUtil.add(user); user.setName("pf3"); HibernateUtil.add(user); iterator(); } static void iterator(){ Session s = HibernateUtil.getSession(); Query query = s.createQuery("from Users"); Iterator<Users> it = query.iterate(); while(it.hasNext()){ System.out.println(it.next().getName()); } } }
执行结果:
Hibernate: insert into Users (ver, name, birthday) values (?, ?, ?)
Hibernate: insert into Users (ver, name, birthday) values (?, ?, ?)
Hibernate: insert into Users (ver, name, birthday) values (?, ?, ?)
Hibernate: select users0_.id as col_0_0_ from Users users0_
Hibernate: select users0_.id as id0_0_, users0_.ver as ver0_0_, users0_.name as name0_0_, users0_.birthday as birthday0_0_ from Users users0_ where users0_.id=?
pf1
Hibernate: select users0_.id as id0_0_, users0_.ver as ver0_0_, users0_.name as name0_0_, users0_.birthday as birthday0_0_ from Users users0_ where users0_.id=?
pf2
Hibernate: select users0_.id as id0_0_, users0_.ver as ver0_0_, users0_.name as name0_0_, users0_.birthday as birthday0_0_ from Users users0_ where users0_.id=?
pf3
可以发现红色那条语句,iterator查询是先查出记录的id号,在需要的时候再去查询,查询时候先从缓存里查找,再从数据库中读取。
由于我的Users是native方式生成主键,所以不会保存在缓存里,因为没访问数据库前不知道数据库生成的id号。
所有的select语句加起来是4条,包括查id的语句,所以一共是N+1次查询。所以缓存没命中的情况下查询效率极低。
同样懒加载的时候也会有N+1次查询的情况,第一次查询出所有当前对象,N次查询查询关联对象。
相关文章推荐
- 传智播客Hibernate视频教程学习笔记1
- 传智播客Hibernate视频教程学习笔记6
- 传智播客Hibernate视频教程学习笔记14
- 传智播客Hibernate视频教程学习笔记29
- 传智播客Hibernate视频教程学习笔记38
- 传智播客Hibernate视频教程学习笔记42
- 传智播客Hibernate视频教程学习笔记10 11 12 13
- 传智播客Hibernate视频教程学习笔记15
- 传智播客Hibernate视频教程学习笔记33
- 传智播客Hibernate视频教程学习笔记44 45
- 传智播客Hibernate视频教程学习笔记50
- 传智播客Hibernate视频教程学习笔记2
- 传智播客Hibernate视频教程学习笔记16
- 传智播客Hibernate视频教程学习笔记21
- 传智播客Hibernate视频教程学习笔记24
- 传智播客Hibernate视频教程学习笔记25
- 传智播客Hibernate视频教程学习笔记27
- 传智播客Hibernate视频教程学习笔记31
- 传智播客Hibernate视频教程学习笔记39
- 传智播客Hibernate视频教程学习笔记46