您的位置:首页 > 其它

5、缓存

2015-12-06 20:12 120 查看
5.1N+1问题

1、使用Iterator查询可能发生N+1,因为iterator仅仅是查询id,当使用到数据时才去相应的数据库中取对象





2、使用list+iterator可以有效解决N+1





最佳实践:一般不用iterator()

5.2、一级缓存

1、一级缓存,缓存对象,并且session内有效,默认不会关闭,除非程序员控制





2、一级缓存仅仅只是在session内部有效





3、可以通过session.clear来清空缓存



4、session.clear的使用方式(只有在进行批量操作时才使用)





5.3、二级缓存

二级缓存属于SessionFactory级别的缓存,缓存的也是对象

使用二级缓存需要进行配置,并且会使用到一些其他的二级缓存开源依赖包

1、启用二级缓存





2、在相应类中开启二级缓存

  2.1、在annotation中开启





  2.2、在xml配置文件中开启





3、二级缓存的使用





4、对于hql而言,如果查询的是对象依然会将对象缓存到二级缓存中





5、如果hql查询的不是对象就无法缓存





最佳实践:二级缓存的设置一般设置为read_only此时无法修改,所以一般要把不会修改的对象设置为二级缓存。诸如:学生管理系统中的部门信息,专业信息,班级信息等不容易修改的信息将其放到二级缓存中。二级缓存不建议使用read_writer。(不同的项目,不同的考虑)

5.4、查询缓存

查询缓存不会缓存对象,仅仅只是会缓存HQL语句,如果HQL语句中查询的是一组对象,此时查询缓存也不会缓存对象,而是缓存对象的id。而且查询缓存是SessionFactory级别的缓存

查询缓存同样需要配置之后才能开启

1、开启查询缓存





2、在查询中设置查询缓存





3、查询缓存如果条件不一样也会发sql





4、查询缓存的N+1问题演示(先关闭二级缓存)





但是如果打开二级缓存就不会出现N+1问题,因为二级缓存会缓存对象

最佳实践:查询缓存一定要在查询语句固定的时候打开,而且如果要使用查询缓存,就必须开启二级缓存,否则会出现N+1问题
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: