- 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 一级缓存的作用。
- 减少访问数据库的频率。应用从缓存中读取数据的速度比从数据库中获取数据要快,提高了数据的访问性能。
- 当缓存中的对象之间存在循环关联关系事。Session保证不会出现访问对象的关联死循环,以及有死循环造成的JVM堆栈溢出问题。
- 保证数据库中的相关记录与缓存中的对象保持同步。
- hibernate 一级缓存的实现机制。脏检查机制-快照(SnapShot)
- 如何同步的:当一个对象加入到了Session的缓存中,Session会为对象的属性值复制一份快照当Session清理缓存时会比较对象的当前属性值和快照的值,如果对象的值发生了变化,就称这个对象是“脏对象”,从而同步更新数据库。
- 当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();
}
}
}