1.  什么是缓存

数据存储到数据库里面,数据库本身是一个文件系统,使用流方式操作文件(效率不高)

改进方式:把数据存到内存中,不需要使用流方式,可以直接读取内存中的数据

缓存:内存中的临时数据,当内存释放时,缓存消失。在读取数据时,先去缓存中查找,缓存中有就直接拿出,缓存中没有则再去数据库中查询

缓存的优点:降低IO读写、提高执行效率。

2.  一级缓存

Hibernate的一级缓存就是指Session缓存,Session缓存是一块内存空间,用来存放相互管理的java对象,在使用Hibernate查询对象的时候,首先会使用对象属性的OID值在Hibernate的一级缓存中进行查找,如果找到匹配OID值的对象,就直接将该对象从一级缓存中取出使用,不会再查询数据库;如果没有找到相同OID值的对象,则会去数据库中查找相应数据。当从数据库中查询到所需数据时,该数据信息也会放置到一级缓存中。Hibernate的一级缓存的作用就是减少对数据库的访问次数(降低IO读写次数)

Hibernate的一级缓存有如下特点:

Ÿ 一级缓存默认是打开状态

Ÿ 一级缓存的使用范围是session范围(从session创建到session关闭)

Ÿ 一级缓存中存储的数据必须都是持久态数据

测试:@Test

public void testCache(){

//从Hibernate封装的工具类中获取Session对象

Session session=HibernateUtil.openSession();

//开启事务

Transaction tx=session.beginTransaction();

//第一次执行get方法:一级缓存中无数据,会去数据库中查询

Customer c1=session.get(Customer.class, 100L);

System.out.println("One : "+c1);

//第二次执行get方法:一级缓存中有数据,直接获取缓存中的数据

Customer c2=session.get(Customer.class, 100L);

System.out.println("Two : "+c2);

System.out.println(c1==c2);//结果为true

tx.commit();

session.close();

}

Ÿ 两次get方法同一个对象 只有一个查询语句

3.快照机制:

Hibernate 向一级缓存放入数据时,同时复制一份数据放入到Hibernate快照中,当使用commit()方法提交事务时,同时会清理Session的一级缓存,这时会使用OID判断一级缓存中的对象和快照中的对象是否一致,如果两个对象中的属性发生变化,则执行update语句,将缓存的内容同步到数据库,并更新快照;如果一致,则不执行update语句。

结论:Hibernate快照的作用就是确保一级缓存中的数据和数据库中的数据一致

@Test

public void testUpdateName(){

//从Hibernate封装的工具类中获取Session对象

Session session=HibernateUtil.openSession();

//开启事务

Transaction tx=session.beginTransaction();

//第一步:先查询出客户信息(根据ID查询)

Customer c=session.get(Customer.class, 95L);

//第二步:对查询出的客户实体进行修改(修改名称)

c.setCustName("传智.黑马程序员");

//第三步:调用Hibernate方法实现更新操作

//session.update(c); //常规方式是要调用update方法,但此处省略看看执行结果

tx.commit();

session.close();

}

hibernate中的缓存问题与快照机制的更多相关文章

  1. hibernate中的缓存机制

    一.为什么要用Hibernate缓存? Hibernate是一个持久层框架,经常访问物理数据库. 为了降低应用程序对物理数据源访问的频次,从而提高应用程序的运行性能. 缓存内的数据是对物理数据源中的数 ...

  2. 【Hibernate】解析hibernate中的缓存

    Hibernate中的缓存一共有三种,一级缓存.二级缓存.查询缓存.缓存除了使用Hibernate自带的缓存,还可以使用redis进行缓存,或是MongoDB进行缓存. 所使用的Demo: User. ...

  3. 使用Redis在Hibernate中进行缓存

    Hibernate是Java编程语言的开放源代码,对象/关系映射框架.Hibernate的目标是帮助开发人员摆脱许多繁琐的手动数据处理任务.Hibernate能够在Java类和数据库表之间以及Java ...

  4. JavaWeb_(Hibernate框架)Hibernate中一级缓存

    Hibernate中一级缓存 Hibernate 中的缓存分为一级缓存和二级缓存,这两个级别的缓存都位于持久化层,并且存储的都是数据库数据的备份.其中一级缓存是 Hibernate 的内置缓存,在前面 ...

  5. Hibernate 中一级缓存和快照区的理解

    刚刚开始的时候觉得这个快照区很难理解,在网上看了很多博客之后,开始明白了.我是结合 ADO.NET 理解的,在ADO.NET 中有一个类, 叫 SqlCommandBuilder,在我看来,他就是 A ...

  6. 分享知识-快乐自己:论Hibernate中的缓存机制

    Hibernate缓存 缓存: 是计算机领域的概念,它介于应用程序和永久性数据存储源之间. 缓存: 一般人的理解是在内存中的一块空间,可以将二级缓存配置到硬盘.用白话来说,就是一个存储数据的容器.我们 ...

  7. Hibernate中一级缓存和二级缓存使用详解

    一.一级缓存二级缓存的概念解释 (1)一级缓存就是Session级别的缓存,一个Session做了一个查询操作,它会把这个操作的结果放在一级缓存中,如果短时间内这个 session(一定要同一个ses ...

  8. Hibernate中一级缓存和二级缓存

    缓存是介于应用程序和物理数据源之间,其作用是为了降低应用程序对物理数据源访问的频次,从而提高了应用的运行性能.缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事 ...

  9. Hibernate中一级缓存概念以及flush与clear的区别

    Hibernate采用缓存机制提高数据查询效率.缓存分为一级缓存和二级缓存,一级缓存在Session中存在,二级缓存需要手动配置. 在一级缓存中,如果数据保存到数据库中后,而session又没有关闭的 ...

随机推荐

  1. String.Format 格式化货币的小问题

    今天在开发过程中,遇到一件让我觉得比较纳闷的事情:用String.Format 格式化充值金额的时候,我这样处理: String.Format("{0:C2}", dr[" ...

  2. ProgressDialog的使用及逻辑处理

    一般用的情况先声明一个ProgressDialog progressShow = true;(用来判断用户是否点击了取消键) final ProgressDialog pd = new Progres ...

  3. 【转】国际GNSS服务组织IGS

    国际GNSS服务组织The International GNSS Service,简称IGS,前身为国际GPS服务组织.IGS提供的高质量数据和产品被用于地球科学研究等多个领域. IGS组织由卫星跟踪 ...

  4. H3c交换机配置端口镜像详情

    端口镜像 需要将G0/0/1口的全部流量镜像到G0/0/2口,即G0/0/1为源端口,G0/0/2为目的端口. 配置步骤 1.进入配置模式:system-view: 2.创建本地镜像组:mirrori ...

  5. cache.config文件配置模板

    # # cache.config # # The purpose of this file is to alter caching parameters of # specific objects o ...

  6. [PHP]全局使用 Composer 组件的思路

    /** * 全局使用 composer 组件的步骤: * * 1. 建一个包含所有需要全局使用的composer包的项目. * 如:globalVendor/ * composer init 初始化 ...

  7. 理解DNS

    理解DNS 写在前面: 目前,我们大部分的网络通信都是基于TCP/IP协议的,而TCP/IP又基于IP地址作为唯一标识进行通信,随着需要记忆的IP地址数量的增多,肯定会超出我们的记忆能力范围,但如果使 ...

  8. 个性化推荐调优:重写spark推荐api

    最近用spark的mlib模块中的协同过滤库做个性化推荐.spark里面用的是als算法,本质上是矩阵分解svd降维,把一个M*N的用户商品评分矩阵分解为M*K的userFeature(用户特征矩阵) ...

  9. js实现文本框输入文字个数限制代码

    html: <div class="curr_eval_box">                <input type="hidden" n ...

  10. Python字典(dict)使用技巧

    字典dict是Python中使用频率非常高的数据结构,关于它的使用,也有许多的小技巧,掌握这些小技巧会让你高效地的使用dict,也会让你的代码更简洁. 1.默认值 假设name_for_userid存 ...