Hibernate缓存应用的积累与总结

Hibernate缓存应用的积累与总结

ID:40747131

大小:28.40 KB

页数:13页

时间:2019-08-07

Hibernate缓存应用的积累与总结_第1页
Hibernate缓存应用的积累与总结_第2页
Hibernate缓存应用的积累与总结_第3页
Hibernate缓存应用的积累与总结_第4页
Hibernate缓存应用的积累与总结_第5页
资源描述:

《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缓存,没有就创建代理,实际使用数

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。