hibernate缓存
2014-09-19 11:51
375 查看
今天学习和使用了hibernate的缓存,在此记录一下自己的一点理解
这篇文章是我在学习的时候参考的,下面将学习的几个要点记录下来
关于N + 1问题
在我们通过Query接口对查询结果Iterate的时候容易出现N +1问题,请看一个例子
这里就会出现N+1问题,首先会发出一条sql ,如 select p_.id from People limit ? ,首先将id都查出来,然后在遍历的时候会去查询每一个People,
如 select p.id , p.name from people
如何避免N+1
简单的方法就是直接用Query的list方法,如
Iterator有什么用
我们来看看Iterator的作用,假设我们有一个很大的结果集,之前讲了,如果用Query的list方法会每次都发出sql进行查询,现在我们又一个方法要多次对表进行查询,当第一次进行list查询时查询出来的对象就会保存的session中了,当第二次查询时如果我们用iterator(),那么只会发一条查询id的sql , 然后对象 会在session中去取,因为我们list的时候,session已经将对象保存在当前session中了,这就是一级缓存,每个session一份
这篇文章是我在学习的时候参考的,下面将学习的几个要点记录下来
关于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一份