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

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-13 10:21:02

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

《Hibernate学习笔记之三》:联合主键的映射

<Hibernate学习笔记之三>:联合主键的映射 就如在前面所举的例子一样,是使用的id作为唯一的主键,一般情况下我们也只使用唯一的一个属性作为主键,但是在实际中,我们可能会遇到几个属性作为主键的情况,因此,在本篇博文中,就来介绍下,联合主键的映射关系应该如何来做?? 联合主键的映射有两种方式来进行实现. 1.使用映射文件 XXX.bhm.xml 2.使用Annotation Hibernate首先需要使用联合主键的实体类必须实现Serializable接口,即为了使序列能够被序列化进行传输

hibernate学习笔记之三(单条记录的增删改查)

(hibernate学习笔记系列来自于 "疯狂Java" Hibernate视频学习) 保存用户 session.save(person); session.persist(person); 查询用户 load(Class theClass,Serializable id) get(Class theClass,Serializable id) 修改用户 session.update(person) session.merger(person); 保存或修改用户 session.sav

HIbernate学习笔记3 之 缓存和 对象的三种状态

一.hibernate一级缓存 *  hibernate创建每个Session对象时,都会给该Session分配一块独立的缓冲区,用于存放Session查询出来的对象,这个分配给session的缓存区也叫session级缓存.session取数据时,会优先向缓存区取数据,如果存在就直接取,不存在就去数据库查询,降低了数据库访问次数. * 一级缓冲是默认开启的,查询时会自动使用.每个session是独立的,save.update.delete.操作都会出发缓存更新. 二.缓存的管理 * sessi

Hibernate学习笔记_02

上篇文章(传送门:Hibernate学习笔记_01)介绍了Hibernate是什么,如何搭建,配置文件详解以及Hibernate的一些基本API详解这几个方面做了简单介绍,那么本文将会从一下5个方面记录Hibernate的学习经历:1.hibernate中的实体规则 2.hibernate中的对象状态 3.hibernate进阶-- 一级缓存 4.hibernate中的事务 5.hibernate中的批量查询(概述) Ⅰ.Hibernate中的实体规则 在Hibernate使用中,需要创建与数据

mybatis学习笔记(13)-查询缓存之二级缓存

mybatis学习笔记(13)-查询缓存之二级缓存 mybatis学习笔记13-查询缓存之二级缓存 二级缓存原理 开启二级缓存 调用pojo类实现序列化接口 测试方法 useCache配置 刷新缓存就是清空缓存 应用场景和局限性 本文主要讲mybatis的二级缓存,二级缓存是mapper级别的缓存,多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的. 二级缓存原理 首先开启mybatis的二级缓存. sqlS

mybatis学习笔记(14)-查询缓存之中的一个级缓存

mybatis学习笔记(14)-查询缓存之中的一个级缓存 mybatis学习笔记14-查询缓存之中的一个级缓存 查询缓存 一级缓存 一级缓存工作原理 一级缓存測试 一级缓存应用 本文主要讲mybatis的一级缓存.一级缓存是SqlSession级别的缓存. 查询缓存 mybatis提供查询缓存.用于减轻数据压力,提高数据库性能. mybaits提供一级缓存,和二级缓存. 一级缓存是SqlSession级别的缓存.在操作数据库时须要构造sqlSession对象,在对象中有一个数据结构(HashMa

Hibernate学习笔记(3)

两年前曾经学习过Hibernate,也通过博客将Hibernate的学习过程记录下来了,地址如下: Hibernate学习笔记(1) Hibernate学习笔记(2) 最近在复习Hibernate,在重新学习的过程中,有了一些新的体会和收获,现在将其总结成博客,供以后作为参考资料使用. 一.导入相应的jar包 目前Hibernate更新到了4.x版本,在官网下载后,找到lib文件加中的required文件夹,此外还需要额外导入log4j和数据库驱动包. 二.创建Hibernate配置文件 在sr

《Hibernate学习笔记十一》:树状结构设计

<Hibernate学习笔记十一>:树状结构设计 这是马士兵老师讲解Hibernate的一个作业题,树状结构设计,这是一个比较典型的例子,因此有必要写篇博文记录下. 树状结构的设计,它是在同一个类中使用了多对一(ManyToOne)和一对多(OneToMany). 在完成这个题目我们应该按照如下的步骤进行: 1.先思考数据库的模型应该是什么样的?? 数据库中的模型应该如下:即存在id p_id 2.思考面向对象的模型,及如何来进行映射??? 根据数据库中表的特点,对象应该有id name;由于

MySQL学习笔记之三 表类型

你能用的数据库引擎取决于MySQL在安装时候是如何被编译的.要添加一个新的引擎,就必须编译MySQL.仅仅为了添加一个特性而编译应用程序的想法对于Windows的开发人员来说可能有点小题大做,得不偿失,但是在Unix的世界里,这已经成为了标准.在缺省的情况下,MySQL支持三个引擎:ISAM.MyISAM和HEAP.另外两种类型InnoDB和Berkley(BDB),也常常可以使用. ISAM ISAM是一个定义明确且历经时间考验的数据表格管理方法,它在设计之初就考虑到数据库被查询的次数远远大于