1.Hibernate一级缓存
Hibernate的一级缓存就是指session缓存。
private transient ActionQueue actionQueue;
private transient StatefulPersistenceContext persistenceContext;
actionQueue:它是一个行列队列,它主要是记录crud操作的相关信息。
persistenceContext : 它是我们持久化上下文,它其实是真正的缓存。
在session中定义了一系列的集合来存储数据,他们构成session缓存。
只要session没有关闭,他就会一直存在。
当我们通过Hibernate中的session提供一些API例如save get update等进行操作时。会将持久化对象保存到session中,当下一次在去查询缓存中具有的对象,通过OID来判断。
就不会去从 数据库查询,而是直接从缓存中获取。
Hibernate的一级缓存存在的目的就是为了减少对数据库的访问。
在Hibernate中还有一个二级缓存,它是sessionFactory级别的缓存。
2.Hibernate缓存测试
// 测试一级缓存
@Test
public void test11(){
Session session = hibernateUtils.openSession();
session.beginTransaction();
Csutomer csutomer = session.get(Csutomer.class, 1);//查询id=1的Csutomer对象,如果查询到,会将Csutomer存储到一级缓存中。
Csutomer csutomer2 = session.get(Csutomer.class, 1);//会从一级缓存中查询,而不会向数据库发送sql。
session.getTransaction().commit();
session.close();
}
>3.持久化对象具有自动更新数据库能力
// 持久化对象具有自动更新数据库能力
@Test
public void test12(){
Session session = hibernateUtils.openSession();
session.beginTransaction();
Csutomer csutomer = session.get(Csutomer.class, 1);//查询id=1的Csutomer对象,如果查询到,会将Csutomer存储到一级缓存中。
csutomer.setName("hans");//操作持久化对象来修改属性。这句话执行时修改一级缓存的数据。
// 事务提交关闭:session关闭,向数据库发送请求时,会判断 一级缓存中的数据是否与快照区一致,如果不一样,就会发送Update语句。
session.getTransaction().commit();
session.close();
}
>4.一级缓存常用的API
–一级缓存特点:
1.当我们通过session的save.update.saveOrUpdate进行操作时,如果一级缓存中没有对象,会将这些对象从数据库中查询到,存储到一级缓存。
2.当我们通过session的load.get.Query的List等方法进行操作时,会先判断一级缓存中是否存在,如果没有才会从数据库中获取,并且将数据存储到一级缓存中。
3.当调用session的close方法时,session缓存清空。
“`