一、1、Session级别缓存属于一级缓存,持久化对象保存在Session一级缓存中(一级缓存引用持久化对象地址),只要session不关闭,一级缓存就存在,缓存中对象也不会被回收;
Session会在一些特定时间点,将缓存中数据flush到数据库中( Transaction的commit()、应用程序执行一些查询操作、调用session的flush方法)。
2、SessionFactory级别缓存属于二级缓存
二、证明一级缓存存在:在获取Customer的Demo中,可以使用同一个Session获取两次Customer,如:
Customer c1=session.get(Customer.class,1);//这时c1是持久化状态,c1存储在session中(一级缓存);
System.out.println(c1.getName());
Customer c2=session.get(Customer.class,1);//可验证c2获取值时并未向数据库发送SQL语句,而且c1值和c2值相同
System.out.println(c2.getName());
三、hibernate快照
Hibernate快照可以让持久化对象具有自动更新能力。
如在执行customer查询操作时Customer c1=session.get(Customer.class,1);如果取到的c1对象Name为”tom“,然后c1.setName("fox");然后提交事务并关闭session。数据库查询customer数据,id为1的记录name值更改为fox。这是快照让对象有了自动更新能力。
Hibernate向一级缓存放入数据时,同事保存快照数据(数据备份),当修改一级缓存数据,在flush操作时,对比缓存和快照,如果不一致自动更新(将缓存数据同步到数据库,并更新快照)
四、一级缓存常见操作:
1、flush,用于刷新一级缓存,使快照区数据和缓存数据一致,在没有提交数据库执行前,数据库数据没有改变
2、clear,清空一级缓存中所有对象
3、evict,清空一级缓存中指定对象
4、refresh,使用数据库数据同步一级缓存与快照(重新查数据库,更新快照和一级缓存)