Hibernate之缓存的原理
一.关于缓存:
其实对于缓存而言,它其实就是一块内存空间,在这个空间中存放了相互关联的持久化对象, 也就是存在于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之缓存的原理的更多相关文章
- Hibernate二级缓存原理
缓存:缓存是什么,解决什么问题? 位于速度相差较大的两种硬件/软件之间的,用于协调两者数据传输速度差异的结构,均可称之为缓存Cache.缓存目的:让数据更接近于应用程序,协调速度不匹配,使访问速度更快 ...
- [转] 关于hibernate的缓存使用
http://blog.csdn.net/woshichenxu/article/details/586361 1. 关于hibernate缓存的问题: 1.1.1. 基本的缓 ...
- 关于hibernate的缓存使用(转)
原文链接:http://blog.csdn.net/woshichenxu/article/details/586361#t0 1. 关于hibernate缓存的问题: 1.1.1. ...
- Hibernate二级缓存简述及基于Spring4,Hibernate5,Ehcache3的二级缓存配置
Hibernate L2缓存 缓存的分类 L2缓存工作原理 放入二级缓存的数据 Ehcache 依赖 ehcache.xml 常用的memoryStoreEvictionPolicy(缓存算法) eh ...
- ssh整合hibernate 使用spring管理hibernate二级缓存,配置hibernate4.0以上二级缓存
ssh整合hibernate 使用spring管理hibernate二级缓存,配置hibernate4.0以上二级缓存 hibernate : Hibernate是一个持久层框架,经常访问物理数据库 ...
- hibernate一级缓存和快照
摘自网络: Hibernate中的一级缓存的底层是以Map形式存在的,key是主键,value是对象,所以它的泛型为Map<Serializable,Object>,key的泛型为串行化是 ...
- java框架篇---hibernate之缓存机制
一.why(为什么要用Hibernate缓存?) Hibernate是一个持久层框架,经常访问物理数据库. 为了降低应用程序对物理数据源访问的频次,从而提高应用程序的运行性能. 缓存内的数据是对物理数 ...
- 话说:Hibernate二级缓存
Hibernate缓存分类: 一.Session缓存(又称作事务缓存):Hibernate内置的,不能卸除. 缓存范围:缓存只能被当前Session对象访问.缓存的生命周期依赖于Session的生命周 ...
- Hibernate二级缓存的使用
1.什么是缓存? 缓存是介于物理数据源与应用程序之间,是对数据库中的数据复制一份临时放在内存中的容器,其作用是为了减少应用程序对物理数据源访问的次数,从而提高了应用程序的运行性能.Hibernate在 ...
随机推荐
- Unity性能优化(3)-官方教程Optimizing garbage collection in Unity games翻译
本文是Unity官方教程,性能优化系列的第三篇<Optimizing garbage collection in Unity games>的翻译. 相关文章: Unity性能优化(1)-官 ...
- Mysql5.5升级到5.7后MySQLdb不能正常使用的问题解决
ubuntu系统 报错信息1 Type "help", "copyright", "credits" or "license&qu ...
- [转]实现一个无法被继承的C++类
From:http://blog.csdn.net/lazy_tiger/article/details/2224899 一个类不能被继承,也就是说它的子类不能构造父类,这样子类就没有办法实例化整个子 ...
- SimpleDateFormat使用详解——日期、字符串应用
public class SimpleDateFormat extends DateFormat SimpleDateFormat 是一个以国别敏感的方式格式化和分析数据的具体类. 它允许格式化 (d ...
- [LeetCode] Random Pick Index 随机拾取序列
Given an array of integers with possible duplicates, randomly output the index of a given target num ...
- [LeetCode] Paint House 粉刷房子
There are a row of n houses, each house can be painted with one of the three colors: red, blue or gr ...
- CSS布局
1流动模型 先来说一说流动模型,流动(Flow)是默认的网页布局模式.也就是说网页在默认状态下的 HTML 网页元素都是根据流动模型来分布网页内容的. 流动布局模型具有2个比较典型的特征: 第一点,块 ...
- 【前端积累】常用事件的js公用方法
var eventUtil={ // 添加句柄 addHandler:function(element,type,handler){ if(element.addEventListener){ ele ...
- 【Quartz】将定时任务持久化到数据库
之前的文章所做的demo是将定时任务的信息保存在内存中的,见以下配置 org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore 如果,我们需要在 ...
- 【BZOJ 1016】【JSOI 2008】最小生成树计数
http://www.lydsy.com/JudgeOnline/problem.php?id=1016 统计每一个边权在最小生成树中使用的次数,这个次数在任何一个最小生成树中都是固定的(归纳证明). ...