5.1、N+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问题
原文:http://www.cnblogs.com/lvjun2015/p/5024288.html