Hibernate一级缓存机制
来源:互联网 发布:网络是我们共同的家园 编辑:程序博客网 时间:2024/05/04 09:21
虽然一直用的SSH框架开发,但是公司项目问题,几乎没怎么深入了解Hibernate的缓存机制,一直对Hibernate的缓存机制不怎么了解。知道在发现缓存机制是非常重要,然后就找资料熟悉了一遍,就先由Hibernate的一级缓存说起。如果
1、先从N+1问题说起,什么是Hibernate的N+1问题?(如果直接了解一级缓存直接看第3点)
当用到Hibernate处理一对多的问题时,查询一方时同时也会将多方(n条)查出来,然后我们可以看到后台Hibernate输出1条一方的语句,然后还有N条多方的语句,这就就是典型的n+1问题。
举例:有个实体类Class班级类(主键为cid),和学生类Student,关联一对多关系后,当查询班级,就会出现一条select * from Class和多条类似select * from Student where cid=1;select * from Student where cid=2;......有N个班级就会有N条SQL,加上班级那1条SQL就是N+1条了。
2、那么如何解决N+1问题?</p><p>(1)、延迟加载,即lazy=true,这种方式是当不需要多方的时候,只加载一方数据,按上述例子的话,就是直接只执行一次select * from Class,当需要查询例子中班级里的学生才会去执行查询学生。</p><p>(2)、第二种就是利用迫切做链接,即fetch="join",说白了就是SQL的左外连接,当在多方设置了fetch="join",那么查询班级的时候直接是select * from Class left join Student on Class.cid=Student.cid
3、了解完N+1问题,现在说说Hibernate一级缓存(session)
Hibernate的一级缓存是保存在session中,已key-value的Map保存,因此当第一次查询数据时,如果session中不存在对应的数据,那么Hibernate就会把数据先保存在session中,下次查询相同内容时,会先从session找,不存在的情况下再执行数据库查询,因此当清空session时,数据也就会清空,下次查询时,将会重新执行数据库查询。
因为session是占用内存的,当我们批量对数据执行操作的时候,最好每执行多少条时先通过session.flush()提交那部分操作过的数据,再执行session.clear()清空session释放内存,这样就可以防止内存占用过大的情况发生。
本篇文章仅本人巩固理解而写,如有理解错误,可以评论指正!
- Hibernate一级缓存机制
- Hibernate一级缓存-快照机制
- Hibernate之缓存机制(一级缓存)
- 【转】Hibernate之缓存机制(一级缓存)
- 【hibernate框架】缓存机制之一级缓存
- 浅谈Hibernate缓存机制:一级缓存、二级缓存
- 模仿hibernate一级缓存session缓存机制
- Hibernate缓存机制之一级缓存
- hibernate中session一级缓存机制
- hibernate的一级缓存和二级缓存机制
- hibernate一级缓存机制(还有二级)
- Hibernate旅程(七)Hibernate缓存机制--一级缓存
- hibernate回顾之缓存机制-一级缓存、二级缓存、查询缓存
- hibernate回顾之缓存机制-一级缓存、二级缓存、查询缓存
- Hibernate缓存机制以及一级缓存和二级缓存的作用
- Hibernate缓存机制以及一级缓存和二级缓存的作用
- Hibernate缓存机制以及一级缓存和二级缓存的作用
- Hibernate缓存机制以及一级缓存和二级缓存的作用
- spinlock_t
- ccf 命令行选项
- 移动开发中Fiddler的那些事儿
- STM32F103程序设计-4-如何制作模板例程文件
- Pandas plot 出图
- Hibernate一级缓存机制
- Material Design(5)
- 浅谈JS继承(三)
- vue init webpack <project name> 下载缓慢问题,脚手架构成所遇问题。
- 51. N-Queens/52. N-Queens II
- STM32F103程序设计-5-控制引脚高低电平的实现
- 抽象工厂
- jQuery笔记之过滤选择器
- express 下的handlebars应用