一.关于缓存:

其实对于缓存而言,它其实就是一块内存空间,在这个空间中存放了相互关联的持久化对象, 也就是存在于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. Checkstyle:整洁你的代码

    内容 Checkstyle简介 下载 Checkstyle的几种使用方式 1) 与Ant结合使用 2) 通过CLI使用 3)在IDE上使用插件 4)在Maven上使用插件 Checkstyle配置 配 ...

  2. ns3 print 丢包内容的两种方法

    1.方法一enable ascii print AsciiTraceHelper ascii; pointToPoint.EnableAsciiAll (ascii.CreateFileStream ...

  3. 理解OAuth 2.0

    转自:http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛 ...

  4. IFC格式简介

    IFC是一个数据交换标准, 用于不同系统交换和共享数据.当需要多个软件协同完成任务时, 不同系统之间就会出现数据交换和共享的需求.这时, 工程人员都希望能将工作成果(这里就是工程数据), 从一个软件完 ...

  5. SSH框架的简单上传功能的实现

    1.创建项目. 2.导入开发包. 3.配置web.xml. 配置内容就是配置struct2的内容如下: <?xml version="1.0" encoding=" ...

  6. 定制sqlmap tamper脚本

    前言 渗透测试过程中遇到注入点常常丢到sqlmap中进行测试,假如网站有waf,sqlmap便无法直接注入了. 测试 在测试某个项目的过程中,一个页面的aid参数,习惯性的提交 and 1=1发现直接 ...

  7. chorme浏览器调试Android设备

    Android设备开启开发者模式,并打开USB调试: 接着在Android设备上运行项目 在chrome浏览器打开F12: 在Remote devices里即可调试页面. ! 一般需要FQ

  8. Python从破门而入到夺门而出

    MD版网盘备份: 链接: https://pan.baidu.com/s/1kVJNRSz 密码: agxt 基于<简明Python教程> 一.Python概览 1.使用PyCharm是非 ...

  9. Linux 建立文件夹的链接

    linux下的软链接类似于windows下的快捷方式 建立软链接 ln -s a b a 就是源文件,b是链接文件名,其作用是当进入b目录,实际上是链接进入了a目录 example:ln -s /ho ...

  10. 疯狂Java笔记

    第四章: 4.6深入数组 1.栈内存和堆内存 每个方法都会建立自己的内存栈,在这个方法内定义的变量会逐个放入栈内存里,随着方法的执行结束,这个方法的内存栈也将自然销毁.因此,所有在方法中定义的局部变量 ...