一.关于缓存:

其实对于缓存而言,它其实就是一块内存空间,在这个空间中存放了相互关联的持久化对象, 也就是存在于Session缓存内的对象,那么Session负责根据持久化对象的状态变化来同步的更新数据库。

Session的缓存是内置的不可卸载的,我们也称其为一级缓存,除了一级缓存,SessionFactory有一个内置的缓存和一个外置的缓存,其中外置的缓存是可插拔的缓存插件,也被称为Hibernate的二级缓存。

二.缓存的作用:

缓存的作用是减低应用程序直接读写永久性数据存储源的频率,从而提供应用的运行性能。

三.缓存的实现原理

缓存它是介于应用程序和永久性数据存储源之间,那么我们常见的永久性数据存储源有硬盘上的文件还有数据等,其实我们可以把缓存中的数据理解成是数据存储用中数据的拷贝,应用程序在运行时直接读写缓存中的数据,只在某些特定的时刻按照缓存中的数据来同步更新数据存储源。

缓存在软件系统中的位置图解:

四.持久化层缓存的范围

持久化层的缓存的范围决定了缓存的生命周期以及可以被谁访问。缓存的范围可以分为三类:事务范围,进程范围,群集范围。

1.事务范围:

我们通常说的一级缓存,它就是一个事务范围的一个缓存,就是当事务提交了,或者事务回滚等操作,都是结束了一个事务,那么我们在开启另一个事务的时候,想在去获取缓存中的数据时,这时是获取不到的。所以说缓存的生命周期依赖于事务的生命周期,当一个事务结束了,缓存的生命周期也就结束了,那么我们在这里可以总结出每个事务都有自己独自的缓存。

事务范围的缓存存储:

在同一个事务的缓存中,持久化类的每个对象具有唯一的OID(相当于数据库中表的主键,我们都知道主键是唯一的),所以相同的OID不可能出现两次,那么我们还是以Emp(员工)和Dept(部门)为例来看一下事务范围的缓存存储:

2.进程范围的缓存:

缓存可以被进程内的所有事务共享。进程范围的缓存可能会存放大量数据,它的物理介质可以是内存或硬盘。缓存内的数据及可以采用相互关联的对象形式,也可以采用对象的散装数据形式:

01.进程范围的缓存存放相互关联的对象:

上图的数据存放形式,数据库中OID为1的Dept对象在内存中始终只有一个拷贝。这种数据存放形式的优点是节省内存。但是我们要考虑在并发环境中,当执行不同事务的各个线程同时长时间操纵同一个OID为1的Dept对象时,必须对这些线程进行同步,而同步会影响并发性能,并且很容易导致死锁(两个事务都要提交的场景),所以在进程范围内部不建议使用这种数据存放机制。

02.进程范围的缓存存储散装数据:

如果缓存中的数据采用的对象时散装数据形式,那么当不同的事务到缓存中查询OID为Dept对象时,获取的Dept对象的散装数据,每个事务都必须分别根据散装数据重新构造出Dept实例,也就是说,每个事务都会获取不同的Dept对象。

3.群集范围:

在群集环境中,缓存被同一个机器或多个机器上的多个进程共享。缓存中的数据被复制到群集的环境中的每个进程节点,进程之间通过远程通信来保证缓存中数据的一致性,缓存中的数据通常是采用对象的散装数据形式。

对于大多数应用,应该慎重的考虑是否需要使用群集范围的缓存,有时它未必能提高应用性能,应为访问群集范围的缓存的速度不一定会比直接访问数据库的速度快多少。

五.缓存的查询机制

持久化层可以提供多种范围的缓存。如果在事务范围的缓存中没有查询到相应的数据,还可以到进程范围或群集范围的缓存中查询,如果在进程范围或群集范围的缓存内没有找到数据,那么只能查询数据库。事务范围的缓存是持久化层的一级缓存,它是必需要走的,进程范围或群集范围的缓存是持久化层的第二级缓存,它是可选的。

Hibernate之缓存的原理的更多相关文章

  1. Hibernate二级缓存原理

    缓存:缓存是什么,解决什么问题? 位于速度相差较大的两种硬件/软件之间的,用于协调两者数据传输速度差异的结构,均可称之为缓存Cache.缓存目的:让数据更接近于应用程序,协调速度不匹配,使访问速度更快 ...

  2. [转] 关于hibernate的缓存使用

    http://blog.csdn.net/woshichenxu/article/details/586361 1.     关于hibernate缓存的问题: 1.1.1.         基本的缓 ...

  3. 关于hibernate的缓存使用(转)

    原文链接:http://blog.csdn.net/woshichenxu/article/details/586361#t0 1.     关于hibernate缓存的问题: 1.1.1.      ...

  4. Hibernate二级缓存简述及基于Spring4,Hibernate5,Ehcache3的二级缓存配置

    Hibernate L2缓存 缓存的分类 L2缓存工作原理 放入二级缓存的数据 Ehcache 依赖 ehcache.xml 常用的memoryStoreEvictionPolicy(缓存算法) eh ...

  5. ssh整合hibernate 使用spring管理hibernate二级缓存,配置hibernate4.0以上二级缓存

    ssh整合hibernate 使用spring管理hibernate二级缓存,配置hibernate4.0以上二级缓存 hibernate  : Hibernate是一个持久层框架,经常访问物理数据库 ...

  6. hibernate一级缓存和快照

    摘自网络: Hibernate中的一级缓存的底层是以Map形式存在的,key是主键,value是对象,所以它的泛型为Map<Serializable,Object>,key的泛型为串行化是 ...

  7. java框架篇---hibernate之缓存机制

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

  8. 话说:Hibernate二级缓存

    Hibernate缓存分类: 一.Session缓存(又称作事务缓存):Hibernate内置的,不能卸除. 缓存范围:缓存只能被当前Session对象访问.缓存的生命周期依赖于Session的生命周 ...

  9. Hibernate二级缓存的使用

    1.什么是缓存? 缓存是介于物理数据源与应用程序之间,是对数据库中的数据复制一份临时放在内存中的容器,其作用是为了减少应用程序对物理数据源访问的次数,从而提高了应用程序的运行性能.Hibernate在 ...

随机推荐

  1. POJ 2398 Toy Storage(计算几何)

    题意:给定一个如上的长方形箱子,中间有n条线段,将其分为n+1个区域,给定m个玩具的坐标,统计每个区域中的玩具个数. 题解:通过斜率判断一个点是否在两条线段之间. /** 通过斜率比较点是否在两线段之 ...

  2. TortoiseGIT的安装过程详解

    TortoiseGIT简介 TortoiseGIT 是Git版本控制系统的一个免费开源客户端,它是git版本控制的 Windows 扩展.可以使你避免使用枯燥而且不方便的命令行.它完全嵌入 Windo ...

  3. Selenium-java-XML启动用例类-简单1

    最简单启动用例方法 1 先建立xml xml代码如下 <?xml version="1.0" encoding="UTF-8"?> <suit ...

  4. [LeetCode] Strobogrammatic Number II 对称数之二

    A strobogrammatic number is a number that looks the same when rotated 180 degrees (looked at upside ...

  5. [LeetCode] Rectangle Area 矩形面积

    Find the total area covered by two rectilinear rectangles in a2D plane. Each rectangle is defined by ...

  6. 强大的支持多文件上传的jQuery文件上传插件Uploadify

    支持多文件上传的jQuery文件上传插件Uploadify,目前此插件有两种版本即Flash版本和HTML5版本,对于HTML5版本会比较好的支持手机浏览器,避免苹果手机Safari浏览器不支持Fla ...

  7. re

    Python3正则表达式应用: 目的:获取匹配的字符串 输出:直接输出或是.group() / .group(0) 常用函数: re.compile 可以把正则表达式编译成一个正则表达式对象,这样可以 ...

  8. Scala - 隐式转换和隐式参数

    隐士转换是Scala提供的一种语法糖 Implicit definitions are those that the compiler is allowed to insert into a prog ...

  9. oracle 修改字符集支持中文

    1.登录sys关闭服务 [oracle@t-e ~]$ export ORACLE_SID=kamiltest1 [oracle@t-e ~]$ sqlplus / as sysdba SQL> ...

  10. java面向对象---对象容器

    泛型类--ArrayList<>; 2.对象数组中的每个元素都是对象的管理者而并非对象本身!!!!! 3.java类的基本数据类型 基本数据类型 包装类 byte Byte short S ...