您的位置:首页 > 其它

hibernate缓存

2014-09-19 11:51 375 查看
今天学习和使用了hibernate的缓存,在此记录一下自己的一点理解

这篇文章是我在学习的时候参考的,下面将学习的几个要点记录下来

关于N + 1问题

在我们通过Query接口对查询结果Iterate的时候容易出现N +1问题,请看一个例子

Iterator<People> pIter = session.createQuery( " from People " ).setMaxResults(10).Iterator();
for(;pIter.hasNext();){
System.out.println(pIter.next().getName());
}


这里就会出现N+1问题,首先会发出一条sql ,如 select p_.id from People limit ? ,首先将id都查出来,然后在遍历的时候会去查询每一个People,

如  select p.id , p.name from people 

如何避免N+1

简单的方法就是直接用Query的list方法,如

Iterator<People> pIter = session.createQuery( " from People " ).setMaxResults(10).list();
for(;pIter.hasNext();){
System.out.println(pIter.next().getName());
}
这样就会只有一条sql语句,你可能会问,竟然这样,那为什么还要iterator呢?不用就不会出现N+1问题了啊

Iterator有什么用

我们来看看Iterator的作用,假设我们有一个很大的结果集,之前讲了,如果用Query的list方法会每次都发出sql进行查询,现在我们又一个方法要多次对表进行查询,当第一次进行list查询时查询出来的对象就会保存的session中了,当第二次查询时如果我们用iterator(),那么只会发一条查询id的sql , 然后对象 会在session中去取,因为我们list的时候,session已经将对象保存在当前session中了,这就是一级缓存,每个session一份
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: