1:Hibernate的一级缓存:
1.1:使用一级缓存的目的是为了减少对数据库的访问次数,从而提升hibernate的执行效率;(当执行一次查询操作的时候,执行第二次查询操作,先检查缓存中是否有数据,如果有数据就不查询数据库,直接从缓存中获取数据);
1.2:Hibernate中的一级缓存,也叫做session的缓存,它可以在session范围内减少数据库的访问次数,只在session范围内有效,session关闭,一级缓存失败;
1.3:一级缓存的特点,只在session范围有效,作用时间短,效果不是特别明显,在短时间内多次操作数据库,效果比较明显。
1.4:当调用session的save/saveOrUpdate/get/load/list/iterator方法的时候,都会把对象放入session缓存中;
1.5:session的缓存是由hibernate维护的,用户不能操作缓存内容;如果想操作缓存内容,必须通过hibernate提供的evict/clear方法操作
1.6:缓存相关的方法(在什么情况下使用上面方法呢?批量操作情况下使用,如Session.flush();先与数据库同步,Session.clear();再清空一级缓存内容):
session.flush();让一级缓存与数据库同步;
session.evict();清空一级缓存中指定的对象;
session.clear();清空一级缓存中所有的对象;
1.7:面试题,不同的session是否会共享缓存数据?
答:不会哦~~~
1.8:list和iterator的区别?
(1)list查询:
答: 一次性把所有的记录都查询出来了;会放入缓存,不会从缓存中取数据;
(2)iterate(N+1次查询):
答: N表示所有的记录总数,即会发送一条语句查询所有的记录的主键,这是第一条查询语句,再根据每一个主键取数据库查询,这是根据第一次查询的条数进行N次查询操作;会放入缓存,也会从缓存中取出数据;
2:Hibernate的懒加载:
2.1:懒加载概念:当用到数据的时候才向数据库查询,这就是hibernate的懒加载特性。
使用懒加载的目的,是提高程序执行效率。
2.2:查询操作:get()方法/load()方法
(1)get()方法,及时加载。及时查询操作;只要调用get方法立刻向数据库查询。
(2)load()方法,默认懒加载,即在使用数据的时候,才向数据库发送查询的sql语句。session关闭以后,不可以使用懒加载。
2.3:懒加载异常:
Session关闭后,不能使用懒加载数据,如果session关闭后,使用懒加载数据报错如:
如何解决session关闭后不能使用懒加载加载数据的问题:
方式一:可以先在关闭session之前使用一下数据,这样关闭以后就可以使用此数据了。如Dept.getDeptName();
方式二(推荐):强迫代理对象初始化操作:Hibernate.initialize(对象);
方式三:关闭懒加载(lazy="false");
方式四(推荐):在使用数据之后再关闭session;
3:二级缓存:
Hibernate提供的缓存 有一级缓存、二级缓存。 目的是为了减少对数据库的访问次数,提升程序执行效率! 一级缓存: 基于Session的缓存,缓存内容只在当前session有效,session关闭,缓存内容失效! 特点: 作用范围较小! 缓存的事件短。 缓存效果不明显。
3.1:二级缓存概述:
二级缓存:
Hibernate提供了基于应用程序级别的缓存即为二级缓存,可以跨多个session,即不同的session都可以访问缓存数据。 这个缓存也叫二级缓存。
Hibernate提供的二级缓存有默认的实现,且是一种可插配的缓存框架!如果用户想用二级缓存,只需要在hibernate.cfg.xml中配置即可; 不想用,直接移除,不影响代码。
如果用户觉得hibernate提供的框架框架不好用,自己可以换其他的缓存框架或自己实现缓存框架都可以。
3.2:查看hibernate.properties配置文件,二级缓存如何配置?
3.3:二级缓存,使用步骤:
1) 开启二级缓存;
2)指定缓存框架;
3)指定那些类加入二级缓存;
4)测试;
3.4:缓存策略: