hibernate的缓存机制
提示:缓存主要是用来提高性能,减少数据库的访问频率,主要用来查询,针对很少改变数据的表,因为如果经常改变表结构或数据,就会导致缓存中的数据跟数据库中的数据不一致,出现脏数据。
1.一级缓存
(1)一级缓存是session级别的缓存,当事务提交或回滚时,session就关闭了,它生命周期就结束了。
(2)作用范围很小,仅限于该session之中,其它的session无法访问,相当于线程级别的缓存;
(3)save,update,saveOrUpdate,load,get,list,iterate,lock等方法都将对象放入一级缓存中,一级缓存不能控制缓存的数(据)量,所以要注意大批量操作数据时可能造成内存溢出,可用evict(清除一条记录),clear(清除缓存)方法清除缓存内容,清除钱需要调用flush函数将缓存的数据更新到数据库;
(4)使用iterater时注意:
iterater查询在没有缓存的情况下会有N+1的问题。
执行上面代码查看控制台的sql语句,第一次iterate查询会发出N+1条sql语句,第一条sql语句查询所有的id,然后根据id查询实体对象,有N个id就发出N条语句查询实体。
第二次iterate查询,却只发一条sql语句,查询所有的id,然后根据id到缓存里取实体对象,不再发sql语句到数据库里查询了。
(5)一级缓存只能存放对象,不能存放对象的属性;
2. 二级缓存
(1)二级缓存是sessionFactory级别的缓存,不同session可以访问二级缓存的数据,当然,它也是存放对象的,不存放对象属性
(2)二级缓存必须让sessionfactory管理,让sessionfactory来清除二级缓存。sessionFactory.evict(Student.class);//清除二级缓存中所有student对象,sessionFactory.evict(Student.class,1);//清除二级缓存中id为1的student对象。
(3) Hibernate的二级缓存的实现原理与一级缓存是一样的,也是通过以ID为key的Map来实现对对象的缓存。
(4)二级缓存的适用范围

浙公网安备 33010602011771号