【SSH】SSH之Hibernate框架:Hibernate的一级缓存

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其实是将查到的对象在缓存区和快照区各放了一份。修改的数据是缓存区的,提交事务时发现缓存区和快照区不一样了,所以就会执行更新操作;而如果没有修改数据,提交事务时缓存区和快照区还是一样的,就不会更新数据库了。

发布了128 篇原创文章 · 获赞 17 · 访问量 2726

猜你喜欢

转载自blog.csdn.net/qq_43705275/article/details/104229004