hibernate 一级缓存

  • Java对象在JVM 的生命周期

    new 创建一个对象时,JVM会为该对象分配一块内存空间,只要这个对象被引用变量引用,他就一直在内存中,

  如果该对象不被任何引用变量引用,JVM的垃圾回收器会在适当的时候回收它占用的内存,生命结束。

  • Session的一级缓存。

    在Session的实现中包含一系列的Java集合,这些Java集合构成了Session的缓存,也称之为hhibernate的一级缓存。

  •     图解:

  java代码说明:

  

@Test
public void saveTest() {
Session session =null;
Transaction tx =null;
try {
session = (Session) HibernateUtil.getSession();//sessionFactory.openSession();
tx= session.beginTransaction();// start transaction
Customer cus = (Customer)session.get(Customer.class, 2);
cus=null;//一级缓存。验证Session一级缓存的存在。
Customer cus2 = (Customer)session.get(Customer.class, 2);
System.out.println(cus2);
tx.commit();
} catch (HibernateException e) {
if (tx!=null) {
tx.rollback();
}
e.printStackTrace();
}finally{
if (session!=null) {
session.close();
}
}
}
  •   hibernate 一级缓存的作用。
  1. 减少访问数据库的频率。应用从缓存中读取数据的速度比从数据库中获取数据要快,提高了数据的访问性能。
  2.  当缓存中的对象之间存在循环关联关系事。Session保证不会出现访问对象的关联死循环,以及有死循环造成的JVM堆栈溢出问题。
  3. 保证数据库中的相关记录与缓存中的对象保持同步。
  •  hibernate 一级缓存的实现机制。脏检查机制-快照(SnapShot)
  1. 如何同步的:当一个对象加入到了Session的缓存中,Session会为对象的属性值复制一份快照当Session清理缓存时会比较对象的当前属性值和快照的值,如果对象的值发生了变化,就称这个对象是“脏对象”,从而同步更新数据库。
  2. 当Session 中的对象的属性每次发生变化,并不会立即清理缓存及执行相关的语句,而是在特定时间才清理缓存,这样就可以把几条相关的语句合并成一条语句执行,减少访问数据库的次数,提高访问性能。

  代码演示与缓存清理的时机。

@Test//利用Session的缓存保持内存和数据库的同步。
	public void testFind() {
		Session session =null;
		Transaction tx =null;
		try {
			session = (Session) HibernateUtil.getSession();//sessionFactory.openSession();
			tx= session.beginTransaction();// start transaction
			//query查询下的
			session.setFlushMode(FlushMode.AUTO);//缓存清理的时机。
			Customer cus = (Customer)session.get(Customer.class, 2);
			cus.setGender(true);
			cus.setName("CAOXIAOYAGN");
			tx.commit();
			session.flush();
			session.clear();
			session.evict(cus);
			session.refresh(cus);
		} catch (HibernateException e) {
			if (tx!=null) {
				tx.rollback();
			}
			e.printStackTrace();
		}finally{
			if (session!=null) {
				session.close();
			}
		}
	}

  

原文地址:https://www.cnblogs.com/CAOXIAOYANG/p/8879931.html