hibernate缓存

本文探讨了Hibernate框架中缓存的应用及其对解决N+1查询问题的重要性。介绍了如何利用一级缓存来减少数据库负载,并通过实例对比了Query接口的list与iterator方法的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天学习和使用了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一份

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值