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=&quot;join&quot;,说白了就是SQL的左外连接,当在多方设置了fetch=&quot;join&quot;,那么查询班级的时候直接是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释放内存,这样就可以防止内存占用过大的情况发生。

本篇文章仅本人巩固理解而写,如有理解错误,可以评论指正!

0 0
原创粉丝点击