Hibernate的缓存
Hibernate的缓存是Hibernate提供的一种优化程序的方式,将从数据库查询到的数据存入内存中,避免频繁的访问数据库,当缓存中有需要的数据时就不需要再去数据库查询,这样做不但可以提高访问速度,而且还可以避免因为频繁的访问数据库而造成的计算机性能的消耗。
Hibernate提供了两个级别的缓存:一级缓存和二级缓存。
一级缓存:一级缓存是Session级别的缓存,其生命周期与所在的Session一致,Hibernate的一级缓存是自动开启的,无法关闭;
二级缓存:二级缓存是SessionFatory级别的缓存,其生命周期与所在的SessionFactory一致,Hibernate的二级缓存默认不开启,可以通过配置将其开启。
Session中影响一级缓存的方法有:
- close():关闭当前Session,相应的缓存也将被清空;
- clear():清空当前Session中的所有缓存;
- evict(Object obj):指定清空哪个对象的缓存。
测试一级缓存的存在:
package cn.jingpengchong.test;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import cn.jingpengchong.pojo.Customer;
public class Test {
public static void main(String[] args) {
//1、加载配置文件
Configuration configure = new Configuration().configure();
//2、创建一个SessionFactory
SessionFactory factory = configure.buildSessionFactory();
//3、根据SessionFactory获得一个Session对象
Session session = factory.openSession();
//4、手动开启事务
Transaction transaction = session.beginTransaction();
//5、执行增删改查等操作
Customer customer1 = session.get(Customer.class, 3l);
System.out.println(customer1);
Customer customer2 = session.get(Customer.class, 3l);
System.out.println(customer2);
System.out.println("是否为同一个对象:" + (customer1 == customer2));
//6、提交事务
transaction.commit();
//7、释放资源
session.close();
factory.close();
}
}
如果没有缓存的话,我们对于该程序的执行结果应该是一目了然的,但是因为有了缓存,结果如下:
持久态对象自动更新数据库的原理分析:
上篇博客提到的持久态对象会自动更新数据库的原因也是因为hibernate的一级缓存,第一次查询的时候hibernate其实是将查到的对象在缓存区和快照区各放了一份。修改的数据是缓存区的,提交事务时发现缓存区和快照区不一样了,所以就会执行更新操作;而如果没有修改数据,提交事务时缓存区和快照区还是一样的,就不会更新数据库了。