hibernate学习笔记之三(一级缓存的使用和管理)

(hibernate学习笔记系列来自于 “疯狂Java” Hibernate视频学习)

一级缓存

一级缓存生命周期很短,与session生命周期一致,所以一级缓存也叫session级缓存或事务级缓存。位于缓存中的对象处于持久化状态,它与表中的相关记录对应,session能够在某些时间点,按照缓存中持久化对象的属性来同步数据库中表的记录,这一过程称为清理缓存。

  • 一级缓存实现原理。

    session缓存是由它的实现类sessionImpl中定义的一些集合属性构成的,原理是保证有一个引用在关联着某个持久化对象。保持它的生命周期不会结束。
    
  • session缓存的作用

    • 减少数据库访问,从内存中取数据比数据库汇总要快的多
    • 缓存中的数据库与数据库中的同步;缓存会把改变的sql语句合并,减少访问次数
    • 缓存中的对象存在循环关联时,session会保证不出现访问对象图的死循环。
  • 一级缓存的方法和管理

    • 方法
      • get方法
      • load方法
      • iterater方法
    • 管理

      • session.clear

        清除session,释放这些对象占用的内存

      • session.evict(object)

        删除session缓存中的object对象

      • session.contains(object)

        判断对象是否存在于session缓存中

      • flush

        刷新session,让缓存中的数据立即同步到表

    避免一次性大量的实体数据入库导致内存溢出,可以先flush(),再clear()

  • session清理缓存的时间点

    通过setFlushMode()方法来设置清理缓存的时间点

    • FlushMode.AUTO
      transaction.commit(),session.flush()都将清理缓存,无需手动执行session.flush()
    • FlushMode.COMMIT
      session.flush(),transaction.commit()才执行清理缓存
    • FlushMode.MANUAL
      即便transaction.commit()也不清理缓存,只能通过session.flush来清理
    • FlushMode.ALWAYS
      transaction.commit(),session.flush()的时候都会刷新数据库
  • Hibernate中对象的状态
    • 临时状态
    • 持久状态
    • 离线状态

实例

1、缓存的使用

        /* *缓存的使用 *当我们通过session获得一个对象的时候,如果在本session没有关闭之前,再次获得之前获得过的数据,将直接从session中获取 */
        //1.Configuration
        Configuration config = new Configuration().configure();
        //2.SessionFactory
        ServiceRegistry sr = new ServiceRegistryBuilder().applySettings(config.getProperty()).buildServiceRegistry();
        SessionFactory factory = config.buildSessionFactory(sr);
        //3.Session
        Session session = factory.openSession();
        //4.transaction
        Person p = (Person) session.get(Person.class,1);
        System.out.println(p);
        //下面的语句执行的时候将不会查询数据库
        Person p2 = (Person) session.get(Person.class,1);
        System.out.println(p);
        //5.close
        session.close();
        System.out.println("----------关闭session--------------");
        Session session2 = factory.openSession();
        //不是同一个session,会重新发出查询
        Person p3 = (Person) session2.get(Person.class,1);
        System.out.println(p3);
        session2.close();

2、管理缓存

        /* * contains() * evict() * clear() */
        //1.Configuration
        Configuration config = new Configuration().configure();
        //2.SessionFactory
        ServiceRegistry sr = new ServiceRegistryBuilder().applySettings(config.getProperty()).buildServiceRegistry();
        SessionFactory factory = config.buildSessionFactory(sr);
        //3.Session
        Session session = factory.openSession();
        //4.transaction
        Person p = (Person) session.get(Person.class,1);
        System.out.println(p);
        //判断session是否有缓存参数对应得对象
        if(session。contains(p)){
            System.out.println("true");
            //将指定的对象从session缓存中删除
            session.evict(p);
        }
        //下面的语句执行的时候将会查询数据库
        Person p2 = (Person) session.get(Person.class,1);
        System.out.println(p);
        //5.close
        session.close();

3、批量操作

        /* * clear() */
        //1.Configuration
        Configuration config = new Configuration().configure();
        //2.SessionFactory
        ServiceRegistry sr = new ServiceRegistryBuilder().applySettings(config.getProperty()).buildServiceRegistry();
        SessionFactory factory = config.buildSessionFactory(sr);
        //3.Session
        Session session = factory.openSession();
        //4.transaction
        Transaction tr = ssession.beginTransaction();
        for( int i = 1 ; i <= 100; i ++){
            Person p = new Person();
            p.setName("admin_" + i);
            p.setPassword(123+i);
            p.setBirthday(new Date());
            Serializable id = session.save(p);
            System.out.println("id--------"+id);
            //当save之后对象将不再使用,也就没有了在session中存在的必要,
            //没有及时清理,会占用很多不必要的内存
            //避免一次性大量的实体数据入库导致内存溢出,可以先flush(),再clear()
            if( i % 10 == 0){
                System.out.println("清空缓存");
                session.flush();//刷新session,让缓存中的数据立即同步到表
                session.close();//清除session中缓存德对象,释放这些对象占用的内存
            }
        }
        tr.comit();
        //tr.rollback();出现异常可以回滚
        //5.close
        session.close();

你可能感兴趣的:(Hibernate,一级缓存)