hibernate中N+1问题解决办法
2013-07-11 09:25
323 查看
原文地址:http://ajava.org/article-134-1.html
【问题】什么时候会遇到N+1的问题?【备注】Hibernate默认抓取策略是fetch="select",不是fetch="join",这都是为了延迟加载而准备的。【出现情况】 1)一对多(one-to-many) ,在1的这方,通过1条sql查找得到了1个 ...
【问题】什么时候会遇到N+1的问题?【备注】Hibernate默认抓取策略是fetch="select",不是fetch="join",这都是为了延迟加载而准备的。【出现情况】 1)一对多(one-to-many) ,在1的这方,通过1条sql查找得到了1个 ...
【问题】什么时候会遇到N+1的问题? 【备注】 Hibernate默认抓取策略是fetch="select",不是fetch="join",这都是为了延迟加载而准备的。 【出现情况】 1)一对多(one-to-many) ,在1的这方,通过1条sql查找得到了1个对象,由于关联的存在 ,那么又需要将这个对象关联的集合取出,所以合集数量是n还要发出n条sql,于是本来的1条sql查询变成了 1 +n条 。 2)多对一<many-to-one> ,在多的这方,通过1条sql查询得到了n个对象,由于关联的存在,也会将这n个对象对应的1 方的对象取出, 于是本来的1条sql查询变成了1 +n条 。 3)iterator 查询时,一定先去缓存中找(1条sql查集合,只查出ID),在没命中时,会再按ID到库中逐一查找, 产生1+n条SQL。 【解决办法】 1)lazy=true, hibernate3开始已经默认是lazy=true了;lazy=true时不会立刻查询关联对象,只有当需要关联对象(访问其属性,非id字段)时才会发生查询动作。 2)使用二级缓存, 二级缓存的应用将不怕1+N 问题,因为即使第一次查询很慢(未命中),以后查询直接缓存命中也是很快的。刚好又利用了1+N 。 3 ) 当然你也可以设定fetch="join",一次关联表全查出来,但失去了延迟加载的特性。 |
相关文章推荐
- Hibernate N+1问题及解决办法
- 关于hibernate的n+1问题以及解决办法
- Hibernate N+1 问题及解决办法
- SSH - org.hibernate.LazyInitializationException: could not initialize proxy - no Session问题解决办法
- struts2,hibernate4,spring3配置时问题汇总及解决办法(架包导入问题)
- Hibernate常见问题 No row with the given identifier exists问题的解决办法及解决
- Hibernate中多表联合查询遇到的问题(原生态的SQL语句解决办法)
- struts2,hibernate4,spring3配置时问题汇总及解决办法
- Hibernate使用原生SQL多表查询时字段名相同导致查询数据覆盖问题解决办法
- jboss服务器上搭建Hibernate项目出现的validator问题解决办法
- Hibernate 级联保存时 偶尔会出现 "id to load is required for loading" 问题的解决办法
- Hibernate: cannot simultaneously fetch multiple bags 问题的解决办法
- struts2,hibernate4,spring3配置时问题汇总及解决办法
- 使用Hibernate 5.0、4.0、3.0 createSQLQuery执行原生Sql语句 遇到问题及解决办法集锦
- struts2,hibernate4,spring3配置时问题汇总及解决办法(架包导入问题)
- struts2,hibernate4,spring3配置时问题汇总及解决办法
- 使用hibernate心得——字符串超长的解决办法(setCharacterStream出现顺序问题)
- Hibernate3 中一个不能查询与插入中文字符的问题解决办法
- 如何解决Hibernate 的N+1问题 .list to map
- Hibernate: cannot simultaneously fetch multiple bags 问题的解决办法