zoukankan      html  css  js  c++  java
  • 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();
    			}
    		}
    	}
    

      

  • 相关阅读:
    Shiro认证过程?
    使用过Redis做异步队列么,你是怎么用的?
    使用 Spring Boot有什么好处
    Spring Boot、Spring MVC 和 Spring 有什么区别?
    es
    python并发编程
    Go基础05
    Go04基础
    Go03基础
    Go基础02
  • 原文地址:https://www.cnblogs.com/CAOXIAOYANG/p/8879931.html
Copyright © 2011-2022 走看看