摘自网络:       

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. TensorFlow和Keras完成JAFFE人脸表情识别

    cut_save_face.py #!/usr/bin/python # coding:utf8 import cv2 import os import numpy as np import csv ...

  2. JS函数、变量作用域

    函数参数 函数的()中指定一个或多个形参(形式参数),多个形参之间用,号隔开,声明形参相当于在函数内部声明了对应的变量,但不赋值.在调用时在()中指定实参  调用时解析器不会检查实参类型.数量,实参可 ...

  3. Mybatis自动生成,针对字段类型为text等会默认产生XXXXWithBlobs的方法问题

    需要修改generatorConfiguration.xml,里面的table加属性:<table tableName="t_ticketcase" domainObject ...

  4. Pandas 基础(8) - 用 concat 组合 dataframe

    以各个城市的天气为例, 先准备下面的数据: 印度天气的相关信息: import pandas as pd india_weather = pd.DataFrame({ 'city': ['mumbai ...

  5. 基本设置_common_setting

    comment(备注) ID(请勿修改) Param(参数) 说明与格式 积分物品ID设置 1 60000 积分属性虚拟货币,存储在Auth库account表TokenAmount字段. 这里设置积分 ...

  6. java笔记 -- GregorianCalendar和DateFormateSymbols 类方法

    java.util.GregorianCalendar new GregorianCalendar() 构造一个日历对象, 用于表示默认地区,默认时区的当前时间. new GregorianCalen ...

  7. ehcache 简介和基本api使用

    文章转载自: https://blog.csdn.net/zhouzhiwengang/article/details/59838105 1.ehcahce简介 在开发高并发量,高性能的网站应用系统时 ...

  8. 一个完整的成年果蝇大脑的电子显微镜图谱 | A Complete Electron Microscopy Volume of the Brain of Adult Drosophila melanogaster

    paper:A Complete Electron Microscopy Volume of the Brain of Adult Drosophila melanogaster 果蝇是一个非常完美的 ...

  9. opencv3.0配置opencv_contrib

    在opencv3.0中无法直接使用sift,surf等特征点检测算子,需要额外配置opencv_contrib. 在查看网上诸多教程,失败n次后,终于找到了正确的配置方式. visual studio ...

  10. HostPort和NodePort

    https://blog.51cto.com/12462495/2163239?source=dra