hibernate缓存机制(二)-一级缓存解决n+1问题
2016-06-20 15:11
381 查看
前面已经提到了n+1问题,想了解n+1问题请访问hibernate缓存机制(一)-n+1问题。
此篇文章我们瞎扯一下hibernate的一级缓存、hibernate的一级缓存是怎么解决n+1的问题以及存在的弊端。
一、hibernate一级缓存:
1.Session 级别的缓存,它同session邦定。它的生命周期和session相同。Session消毁,它也同时消毁;管理一级缓存,一级缓存无法取消,用两个方法管理,clear(),evict()
2.两个session 不能共享一级缓存,因它会伴随session的生命周期的创建和消毁;
3.Session缓存是实体级别的缓存,就是只有在查询对象级别的时候才使用,如果使用HQL和SQL是查询属性级别的,是不使用一级缓存的!切记!!!!
我们来看看hibernate提供的一级缓存:
我们来看看控制台输出:
我们看到此时hibernate仅仅只会发出一条 sql 语句,因为第一行代码就会将整个的对象查询出来,放到session的一级缓存中去,当需要再次查询学生对象时,此时首先会去缓存中看是否存在该对象,如果存在,则直接从缓存中取出,就不会再发sql了,但是要注意一点:hibernate的一级缓存是session级别的,所以如果session关闭后,缓存就没了,此时就会再次发sql去查数据库。
我们看到此时会发出两条sql语句,因为session关闭以后,一级缓存就不存在了,所以如果再查询的时候,就会再发sql。要解决这种问题,我们应该怎么做呢?这就要我们来配置hibernate的二级缓存了,也就是sessionFactory级别的缓存。
请参加下一篇文章,hibernate缓存机制(三)-二级缓存
此篇文章我们瞎扯一下hibernate的一级缓存、hibernate的一级缓存是怎么解决n+1的问题以及存在的弊端。
一、hibernate一级缓存:
1.Session 级别的缓存,它同session邦定。它的生命周期和session相同。Session消毁,它也同时消毁;管理一级缓存,一级缓存无法取消,用两个方法管理,clear(),evict()
2.两个session 不能共享一级缓存,因它会伴随session的生命周期的创建和消毁;
3.Session缓存是实体级别的缓存,就是只有在查询对象级别的时候才使用,如果使用HQL和SQL是查询属性级别的,是不使用一级缓存的!切记!!!!
我们来看看hibernate提供的一级缓存:
/** * 此时会发出一条sql,将所有学生全部查询出来,并放到session的一级缓存当中 * 当再次查询学生信息时,会首先去缓存中看是否存在,如果不存在,再去数据库中查询 * 这就是hibernate的一级缓存(session缓存) */ List<Student> stus = (List<Student>)session.createQuery("from Student") .setFirstResult(0).setMaxResults(30).list(); Student stu = (Student)session.load(Student.class, 1); |
Hibernate: select student0_.id as id2_, student0_.name as name2_, student0_.rid as rid2_, student0_.sex as sex2_ from t_student student0_ limit ? |
try { session = HibernateUtil.openSession(); /** * 此时会发出一条sql,将所有学生全部查询出来,并放到session的一级缓存当中 * 当再次查询学生信息时,会首先去缓存中看是否存在,如果不存在,再去数据库中查询 * 这就是hibernate的一级缓存(session缓存) */ List<Student> stus = (List<Student>)session.createQuery("from Student") .setFirstResult(0).setMaxResults(30).list(); Student stu = (Student)session.load(Student.class, 1); System.out.println(stu.getName() + "-----------"); } catch (Exception e) { e.printStackTrace(); } finally { HibernateUtil.close(session); } /** * 当session关闭以后,session的一级缓存也就没有了,这时就又会去数据库中查询 */ session = HibernateUtil.openSession(); Student stu = (Student)session.load(Student.class, 1); System.out.println(stu.getName() + "-----------"); |
Hibernate: select student0_.id as id2_, student0_.name as name2_, student0_.sex as sex2_, student0_.rid as rid2_ from t_student student0_ limit ? Hibernate: select student0_.id as id2_2_, student0_.name as name2_2_, student0_.sex as sex2_2_, student0_.rid as rid2_2_, classroom1_.id as id1_0_, classroom1_.name as name1_0_, classroom1_.sid as sid1_0_, special2_.id as id0_1_, special2_.name as name0_1_, special2_.type as type0_1_ from t_student student0_ left outer join t_classroom classroom1_ on student0_.rid=classroom1_.id left outer join t_special special2_ on classroom1_.sid=special2_.id where student0_.id=? |
请参加下一篇文章,hibernate缓存机制(三)-二级缓存
相关文章推荐
- 超声波避障
- Unity3D关于跨域访问的处理
- java API接口文档方法调用
- RSA算法的简单认识nhe
- leetcode 283 Move Zeroes --个人的新思路
- Maven pom常用配置解析表
- Linux下cat命令用法
- Android Log日志
- WINxp解决机箱前置面板没声音图文教程
- Dell R710 iDRAC6 远程控制卡设置
- PHP面向对象中常见的关键字
- 广东海洋大学 电子1151 孔yanfei python语言程序设计 第七周
- [疯狂Java]正则表达式:Java正则表达式语法、贪婪模式/勉强模式
- Math.ceil() 、Math.floor() 、Math.round() 三个函数的理解
- 【Oracle】GoldenGate 12.2 OGG-01201 Error reported by MGR : Access denied.
- IntelliJ IDEA / Eclipse 自动生成 Author 注释 签名
- c#一个FTP操作封装类FTPHelper
- System.Types.hpp(77): E2029 'TObject' must be a previously defined class or struct
- 扛得住双11的Mysql---操作系统
- C# 文件转字节数组 byte[]