一.缓存作用:减少对数据库的访问次数!从而提升hibernate的执行效率。
二.
1)Hibernate 中的一级缓存,也叫做session的缓存,它可以在session范围内减少数据库的访问次数! 只在session范围内有效!session关闭,一级缓存失效!
特点:
2)当调用session的save/saveOrUpdate/get/load/list/iterator方法的时候,都会把对象放入session的缓存中。
3)session的缓存由hubernate维护,用户不能操作缓存内容;如果要操作缓存内容,必须通过hibernate提供的evit/clear方法操作。
1.只在session范围内有效,作用时间短,效果不是很明显。
2.在段时间内多次操作数据库,效果比较明显。
三.相关方法
session.flush(); //让以及缓存与数据库同步
session.evict(); //清除指定对象
session.clear(); //清空所有
使用这些方法的情景
批量操作的时候使用这些方法。
第一步:session.flush(); //让以及缓存与数据库同步
第二步:session.clear(); //清空所有
重点一:不同的session无法共享缓存数据
重点二:list与iterator查询的区别
list()
一次把所有数据查询出来
list查询会放入缓存,但不会从缓存中取数据
iterator
n+1查询:n表示所有的记录总数
即先发送一条语句据查询所有记录的主键
再根据每一个主键再去数据库查询!
iterator查询会放入缓存,也会从缓存中读数据
懒加载
get和load区别
get:及时加载,只要调用get方法就加载
load:使用的时候就加载,用到数据才会向数据库查询
懒加载:(lazy)
概念:当用到数据的时候才会向数据库查询,目的是为了提高程序执行效率。
映射属性
lazy
true 使用懒加载
false 关闭懒加载
懒加载异常
Session 关闭后,不能使用懒加载数据!
如果session关闭抛出lazyInitializationException 异常
解决办法
方式1.先使用一下数据
方式2.强迫代理对象初始化
方式3.关闭懒加载
方式4.使用之后再关闭
public void get_load() { Session session = sf.openSession(); session.beginTransaction(); Dept dept = new Dept(); // get: 及时查询 // dept = (Dept) session.get(Dept.class, 9); // System.out.println(dept.getDeptName()); // load,默认懒加载, 及在使用数据的时候,才向数据库发送查询的sql语句! dept = (Dept)session.load(Dept.class, 9); // 方式1: 先使用一下数据 //dept.getDeptName(); // 方式2:强迫代理对象初始化 Hibernate.initialize(dept); // 方式3:关闭懒加载 session.getTransaction().commit(); session.close(); // 在这里使用 System.out.println(dept.getDeptName()); }
lazy的值为“extra”(更智能):
1.在集合数据懒加载的时候提升效率
2.在正真使用数据的时候才向数据库发送sql
3.如果调用size() 和 isEmpty()方法,只是统计,不是真正查数据。