摘自网络:       

Hibernate中的一级缓存的底层是以Map形式存在的,key是主键,value是对象,所以它的泛型为Map<Serializable,Object>,key的泛型为串行化是因为主键都可被序列化。
简单说完一级缓存的底层原理,下面开始讲快照问题。
当程序调用get()方法时,Session会先在缓存区找有没有存在对应的对象,如果是第一次调用,这时缓存区是空的,自然就找不到,那么Session就会发送select语句向数据库查找
,数据找到后将结果返回给Session,这时Session会对数据进行组装成实体对象,并且一式两份,即一份在缓存中,一份是快照,然后Session会将缓存中的那一份返回给程序;
如果这时进行更新操作,那么在Session中会进行对比缓存中的对象与快照中的对象,如果对象的属性发生了变化,那么就会发送update语句对数据库进行更新,如果对象的属性没有变化,
则不发送update语句。
总结,快照是数据库的数据在Session中的代表,也就是说,数据库中的数据一旦发生变化,快照就会随之改变。个人觉得这样设计能减少对数据库的访问,提高数据库的效率。
 hibernate存在2个缓存

  第一级别的缓存是 Session 级别的缓存,它是属于事务范围的缓存(session的一级缓存)

  第二级别的缓存是 SessionFactory 级别的缓存,它是属于进程范围的缓存(二级缓存

session的一级缓存

   使用hibernate进行查询的时候,将查询结果放置到session的一级缓存中,在一级缓存中存在对象,对象使用属性的OID的值进行区分,此时再使用相同的OID进行查询的时候,
首先会在session一级缓存中进行查找是否存在相同的OID 如果存在相同的OID,此时不再查询数据库,而是直接使用一级缓存中存在的对象
如果没有存在相同的OID,此时再查询数据库,将查询得到的结果数据再放置到session一级缓存中 目的:减少访问数据库的次数 session的快照 使用id进行查询数据库,将查询得到的结果放置到session一级缓存中,同时复制一份数据,放置到session的快照中 当使用tr.commit()的时候,同时清理session的一级缓存(flush) 当清理session一级缓存的时候,会使用OID判断一级缓存中对象和快照中的对象进行比对 如果2个对象(一级缓存的对象和快照的对象)中的属性发生变化,则执行update语句,此时更新数据库,更新成一级缓存中的数据
如果2个对象中的属性不发生变化,此时不执行update语句 目的:确保和数据库中的数据一致 Session二级缓存 一个可配置的缓存插件,包括类级别的缓存区域,集合级别的缓存区域,查询级别的缓存区域,时间戳级别的缓存区域 其使用步骤大致如下: 拷贝ehcache-1.5..jar到当前工程的lib目录下 开启二级缓存 <property name="hibernate.cache.use_second_level_cache">true</property> 要指定缓存的供应商 <property name="hibernate.cache.provider_class"> org.hibernate.cache.EhCacheProvider</property> 指定使用二级缓存的类 方法一 在使用类的*.hbm.xml配置 选择需要使用二级缓存的持久化类, 设置它的二级缓存的并发访问策略, <class> 元素的 cache 子元素表明 Hibernate 会缓存对象的简单属性, 但不会缓存集合属性,
若希望缓存集合属性中的元素, 必须在 <set> 元素中加入 <cache> 子元素 方法二 在hibernate.cfg.xml文件中配置(建议) <!-- 指定使用二级缓存的类放在maping下面 --> <!-- 配置类级别的二级缓存 --> <class-cache class="cn.itcast.c3p0.Customer" usage="read-write"/> <class-cache class="cn.itcast.c3p0.Order" usage="read-write"/> <!-- 配置集合级别的二级缓存 --> <collection-cache collection="cn.itcast.c3p0.Customer.orders" usage="read-write"/> 配置ehcache默认的配置文件ehcache.xml(名字固定)(放在类路径下) hibernate中一级缓存、快照、二级缓存面试的时候问得比较多。

hibernate一级缓存和快照的更多相关文章

  1. hibernate一级缓存及对象的状态

    hibernate中实体类对象的状态 在hibernate中实体类对象有三种状态 (1)瞬时态(临时态) 瞬时态:即我们自己创建一个对象,还没有保存到数据库就叫临时态,其实也可以说是对像没有id值,跟 ...

  2. Hibernate一级缓存测试分析

    Hibernate 一级缓存测试分析 Hibernate的一级缓存就是指Session缓存,此Session非http的session会话技术,可以理解为JDBC的Connection,连接会话,Se ...

  3. Hibernate一级缓存和三种状态

    Hibernate一级缓存又称session缓存,生命周期很短,跟session生命周期相同. 三种状态:1.transient(瞬时态):刚new出来的对象,既不在数据库中,也不在session管理 ...

  4. hibernate - 一级缓存和三种状态解析

    转载自:http://www.cnblogs.com/whgk/p/6103038.html 一.一级缓存和快照 什么是一级缓存呢? 很简单,每次hibernate跟数据库打交道时,都是通过sessi ...

  5. hibernate一级缓存

    理解 Hibernate 一级缓存 Hibernate 一级缓存默认是打开,不需要任何的配置.实际上,你无法强制禁止它的使用. 如果你理解了一级缓存实际上和会话是关联的,就很容易理解一级缓存.总所周知 ...

  6. Hibernate一级缓存(基于查询分析)

    首先我们应该弄清什么是hibernate缓存:hibernate缓存是指为了降低应用程序对物理数据源的访问频次,从而提高应用程序的运行性能的一种策略.我们要将这个跟计算机内存或者cpu的缓存区分开. ...

  7. Hibernate一级缓存(补)

    ------------------siwuxie095                                 什么是缓存         缓存是介于应用程序和永久性数据存储源(如:硬盘上的 ...

  8. 转载 hibernate一级缓存和二级缓存的区别

    文章来源:http://blog.csdn.net/defonds/article/details/2308972     hibernate一级缓存和二级缓存的区别 缓存是介于应用程序和物理数据源之 ...

  9. hibernate框架学习第三天:对象状态、一级缓存、快照等

    对象的状态 瞬时状态: 瞬时对象(TO) 应用程序创建出来的对象,不受H3控制 注意:TO对象不具有OID,一旦为TO赋值OID,那么此时就不是TO 持久化状态:持久化对象(PO) 受H3控制的对象, ...

随机推荐

  1. vue-cli 构建项目在IE中无法运行解决方式(build之后可运行)

    IE浏览器(只考虑IE11,更低版本我没考虑)运行时报 Promise未定义的错误 解决办法: 1. 安装babel-polyfill (1.)  npm install babel-polyfill ...

  2. CSS【05】:CSS三大特性

    继承性 作用:给父元素设置一些属性,子元素也可以使用,这个我们就称之为继承性 示例代码: <style> div { color: red; } </style> <di ...

  3. com.borland.jbcl.layout.*;(XYLayout)

    因为某些原因,涉及到需要运行一个十几年前的项目,项目一直报错,缺少.layoutXY,找了好久,CSDN那里一直需要下载,而且收费,而且很麻烦,本来都放弃了的这个jar包原来是java的IDE工具JB ...

  4. _recruit

  5. python tar 打包

    import os import tarfile def make_targz_one_by_one(output_filename, source_dir): tar = tarfile.open( ...

  6. POI 导入excel 代码记录 方便以后粘贴

    import java.io.FileInputStream; import java.io.InputStream; import javax.annotation.Resource; import ...

  7. jTimer

      很多时候我们需要按时间间隔执行一个任务,当满足一定条件时停止执行.此插件旨在解决这一经常遇到的问题. jTimer: (function ($) { $.extend({ timer: funct ...

  8. 弹性盒式布局flexbox(dispaly:flex)

    display:flex flex-direction: row(行)/column(列)/row-reverse/column-reverse反方向  //布局 justify-content: s ...

  9. Steam饥荒

    存档回滚 D:\Program Files (x86)\Steam\userdata\***\219740\remote 巨人国是survival_数字,海难是shipwreck_数字,哈姆雷特是po ...

  10. Linux下更换jdk和配置环境变量

    目前Linux上安装的是jdk7的java环境,由于项目原因需要升级到jdk8,无需卸载掉原本的jdk7,按如下简单步骤即可: 参考了:https://www.cnblogs.com/jiu0821/ ...