欢迎来到天天文库
浏览记录
ID:40747131
大小:28.40 KB
页数:13页
时间:2019-08-07
《Hibernate缓存应用的积累与总结》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、Hibernate缓存应用的积累与总结——杰瑞教育原创,转载请注明出处 Hibernate缓存一直比较难掌握,下面就分析和总结原因,相信你就会慢慢清楚了原来Hibernate缓存也是可以轻松掌握的,但前提要求大家必须跟着动手去验证一下,再用心体会,光看是没有用的一、hibernate一级缓存(Session级别的缓存) hibernate是一个线程对应一个session,一个线程可以看成一个用户。也就是说session级缓存(一级缓存)只能给一个线程用,别的线程用不了,一级缓存就是和线程绑定了。hibernate一级缓存
2、生命周期很短,和session生命周期一样,一级缓存也称session级的缓存或事务级缓存。如果tb事务提交或回滚了,我们称session就关闭了,生命周期结束了。 实验1:体验一级缓存:(动手做做)//同一个session中,发出两次load方法查询Employeeemp=(Employee)session.load(Employee.class,1);System.out.println(emp.getName());//不会发出查询语句,load使用缓存emp=(Employee)session.load(Employ
3、ee.class,1);System.out.println(emp.getName()); 第二次查询第一次相同的数据,第二次load方法就是从缓存里取数据,不会发出sql语句到数据库里查询。 缓存主要是用于查询,hibernate的很多方法都是首先从缓存中取数据如果没有在从数据库中获取,以提升查询效率如:get()/load()、iterate(),而且持久态的对象是会存储在缓存中的。例如:先save保存实体对象,再用load方法查询刚刚save的实体对象,则load方法不会发出sql语句到数据库查询的,而是到缓存里取
4、数据,因为save方法也支持缓存.二、一级缓存特征及其应用: 1.Session级别的缓存,它同session邦定。它的生命周期和session相同。Session消毁,它也同时消毁; 2.两个session不能共享一级缓存,因它会伴随session的生命周期的创建和消毁; 3.Session缓存是实体级别的缓存,就是只有在查询对象级别的时候才使用,如果使用HQL和SQL是查询属性级别的,是不使用一级缓存的!切记!!! 4.iterate查询使用缓存,会发出查询Id的SQL和HQL语句,但不会发出查实体的,它查询完会把
5、相应的实体放到缓存里边,一些实体查询如果缓存里边有,就从缓存中查询,但还是会发出查询id的SQL和HQL语句。如果缓存中没有它会数据库中查询,然后将查询到的实体一个一个放到缓存中去,所以会有N+1问题出现。 5.List()和iterate查询区别:(动手做做) 使用iterate,list查询实体对象*N+1问题,在默认情况下,使用query.iterate查询,有可以能出现N+1问题 所谓的N+1是在查询的时候发出了N+1条sql语句1:首先发出一条查询对象id列表的sqlN: 根据id列表到缓存中查询,如果缓存中
6、不存在与之匹配的数据,那么会根据id发出相应的sql语句list和iterate的区别? list每次都会发出sql语句,list会向缓存中放入数据,而不利用缓存中的数据 iterate:在默认情况下iterate利用缓存数据,但如果缓存中不存在数据有可以能出现N+1问题 6.Get()和load(),iterate方法都会使用一级缓存, Get与load的区别?(动手做做) 1.对于get方法,hibernate会确认一下该id对应的数据是否存在,首先在session缓存中查找,然后在二级缓存中查找,还没有就查询数
7、据库,数据库中没有就返回null。 2.load方法加载实体对象的时候,根据映射文件上类级别的lazy属性的配置(默认为true),分情况讨论: (1)若为true,则首先在Session缓存中查找,看看该id对应的对象是否存在,不存在则使用延迟加载,返回实体的代理类对象(该代理类为实体类的子类,由CGLIB动态生成)。等到具体使用该对象(除获取OID以外)的时候,再查询二级缓存和数据库,若仍没发现符合条件的记录,则会抛出一个ObjectNotFoundException。 (2)若为false,就跟get方法查
8、找顺序一样,只是最终若没发现符合条件的记录,则会抛出一个ObjectNotFoundException。 小结: 1、get方法首先查询session缓存,没有的话查询二级缓存,最后查询数据库;而load方法首先查询session缓存,没有就创建代理,实际使用数
此文档下载收益归作者所有