一、Hibernate的一级缓存
1、缓存的概念:
内存中的临时数据
2、使用缓存的好处:
可以减少和数据库的交互次数,在需要使用数据时,先去缓存中看看有没有,有就直接用,没有,再去查询数据库。
3、什么样的数据适用缓存:
经常查询,不经常修改的数据
数据的对错,对最终结果影响不大的
4、证明hibernate一级缓存存在
/**
* 证明一级缓存确实存在
*
* 明确:
* 一级缓存指的是Session对象的缓存
*
* 一级缓存指的就是Session对象中定义的一些集合。
*/
@Test
public void test1(){
Session s = HibernateUtil.openSession();
Transaction tx = s.beginTransaction();
//首次查询
Customer c = s.get(Customer.class, 1L);//此时会去数据库中查询,把查询出来对象存入了一级缓存
System.out.println(c);//输出
//再次查询
Customer c2 = s.get(Customer.class, 1L);//没有去查询,拿1L去一级缓存中查找,找到后就返回了。
System.out.println(c2);//输出
tx.commit();
s.close();//一级缓存就消失了
}
5、缓存机制的简单图解
二、Hibernate的快照机制
1、什么是快照机制
它的作用就是,用于缓存数据和数据库进行同步。保证数据一致。
为了减少和数据库交互的次数,从而对一级缓存对象进行了拷贝。
2、快照机制的代码体现
/**
* 快照机制
* 它的作用就是,用于缓存数据和数据库进行同步。保证数据一致。
* 为了减少和数据库交互的次数,从而对一级缓存对象进行了拷贝。
*/
@Test
public void test2(){
Session s = HibernateUtil.openSession();
Transaction tx = s.beginTransaction();
//根据id查询一个对象
Customer c = s.get(Customer.class, 1L);//会去查询,还会存入一级缓存
System.out.println(c.getCustName());//TBD云集中心
//修改客户名称
c.setCustName("黑马程序员");
System.out.println(c.getCustName());//黑马程序员
tx.commit();
s.close();
//到此行的时候客户对象还能不能用? 可以使用
System.out.println(c.getCustName());//TBD云集中心 | 黑马程序员
}
3、快照机制的分析图解
三、Hibernate的对象状态
1、三种状态
瞬时态:没有OID,和session没有关系。多见于new出的对象
持久化状态:有OID,和session有关系。多见于从数据库中查询出来的对象
脱管状态:有OID,和session没有状态。
2、三种状态互相转换的图解