Hibernate 解决n+1问题
2013-10-06 16:15
302 查看
问题的产生:
两个一对多关系表:class 1-------n student
当查询List<Class> classes 时有一次select查询,要查询班级内的学生则产生了
for(Class class :classes){
class.setStudents(select * from Student where classid = class.getClassId());//所以要执行classes.size()次select查询
}
总共产生了n+1次查询。频繁的select查询影响了数据库的查询效率。
问题的解决:
Hibernate提供的检索策略:
1.延迟加载策略 :lazy=“true” (需要查找班级的学生时才查找,但还是产生了n+1次select查询,这时可以使用二级缓存在二次查询的时候就可快速直接从缓存中得到第一次查找的数据)。
2.迫外左连接查询:select c from class c left join class.students s on class.students.classId = class.classId;(减少了select查询次数,提高了数据库的查询效率,可以通过where条件语句控制得到所想要的student的数量)。
3.fetch=“join”直接关联的立即检索抓取到班级相关的student对象的数据。(优点:减少了select语句的查询。弊端:每次都进行大量的student抓取,如果关联的student很多则会产生过多的数据查询影响数据库的性能)。
两个一对多关系表:class 1-------n student
当查询List<Class> classes 时有一次select查询,要查询班级内的学生则产生了
for(Class class :classes){
class.setStudents(select * from Student where classid = class.getClassId());//所以要执行classes.size()次select查询
}
总共产生了n+1次查询。频繁的select查询影响了数据库的查询效率。
问题的解决:
Hibernate提供的检索策略:
1.延迟加载策略 :lazy=“true” (需要查找班级的学生时才查找,但还是产生了n+1次select查询,这时可以使用二级缓存在二次查询的时候就可快速直接从缓存中得到第一次查找的数据)。
2.迫外左连接查询:select c from class c left join class.students s on class.students.classId = class.classId;(减少了select查询次数,提高了数据库的查询效率,可以通过where条件语句控制得到所想要的student的数量)。
3.fetch=“join”直接关联的立即检索抓取到班级相关的student对象的数据。(优点:减少了select语句的查询。弊端:每次都进行大量的student抓取,如果关联的student很多则会产生过多的数据查询影响数据库的性能)。
相关文章推荐
- Hibernate N+1问题及解决办法
- Hibernate的1+N(N+1)问题与解决方法
- 如何解决Hibernate 的N+1问题 .list to map
- Hibernate解决n+1问题
- Hibernate解决n+1问题
- 怎么解决Hibernate的n+1问题文章2
- hibernate中N+1问题解决办法
- hibernate的N+1问题的分析与解决
- Hibernate解决n+1问题
- 关于hibernate的n+1问题以及解决办法
- Hibernate N+1 问题及解决办法
- 玩转SSH--Hibernate(三)---手动修改数据库,前台查询信息不同步更新问题解决方法
- 解决 spring mvc 3.0 结合 hibernate3.2 使用<tx:annotation-driven>声明式事务无法提交的问题
- 解决Spring使用中hibernate懒加载问题
- Hibernate学习笔记-----n+1问题
- Spring使用OpenSessionInViewFilter解决Hibernate的lazy延时加载问题
- iBATIS一对多/多对多N+1问题解决方案
- Hibernate N+1问题
- Hibernate 4.3.11 下问题的解决
- 在hibernate中有的数据库版本过高解决数据库乱码问题