首页 > 其他 > 详细

5、缓存

时间:2015-12-06 21:05:56      阅读:190      评论:0      收藏:0      [点我收藏+]

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问题

5、缓存

原文:http://www.cnblogs.com/lvjun2015/p/5024288.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!