- 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(); } } }