缓存的意义
l应用程序中使用的数据均保存在永久性存储介质之上,当应用程序需要使用数据时,从永久介质上进行获取。缓存是介于应用程序与永久性存储介质之间的一块数据存储区域。利用缓存,应用程序可以将使用的数据临时放入缓存,需要再次使用时从缓存中获取,降低应用程序与永久性介质之间数据交换的频率,提升应用程序的运行性能。
l缓存中的数据都来源于永久性存储介质之上,缓存仅仅是一个辅助性的区域,不是数据的最终存放位置。通常缓存区域会选取比永久性存储介质访问速度稍快的空间,例如内存中。
二级缓存
l二级缓存是一种名称的定义,指在已有缓存的基础上,再增设一种缓存。
l二级缓存弥补一级缓存的不足。一级缓存的数据是针对单次操作而设计,服务于一次请求操作。由于单次操作的数据量不会涉及很多数据,因此一级缓存存储数据量较小,生命周期较短。并且单次数据操作完毕后,下一次请求的数据将无法使用上一次缓存的数据。二级缓存有效弥补一级缓存的缺陷,在现有一级缓存基础上,在多次请求操作间进行数据共享,有效减少访问永久介质的次数。
Hibernate支持的缓存
lHibernate支持两种缓存
•一级缓存
•也称作Session级别的缓存,该缓存无法卸载,属于Hibernate内置的缓存,绑定每次连接数据库的Session对象。
•二级缓存
•也称作SessionFactory级别的缓存,该缓存是通过外部技术实现的,通过使用不同的缓存供应商提供的缓存技术,为Hibernate加开一级缓存,可以根据需要进行安装或卸载。
•目前Hibernate支持的二级缓存主要有4种
•ehcache
•OpenSymphony
•SwarmCache
•JBossCache
缓存结构图
缓存结构图(按OID查询数据)
二级缓存工作流程
l二级缓存开启后的数据操作
•查询数据
•如果按OID查找数据,检查一级缓存中是否存在查找数据,如果存在返回给客户端
•如果按OID查找数据,一级缓存中不存在要查找的数据,检查二级缓存中是否存在查找数据,如果存在将二级缓存数据加载入一级缓存,然后返回给客户端
•如果一级缓存和二级缓存中都不存在要查找的数据,到数据库中执行对应的SQL语句查询出对应的数据,将数据加载一级缓存和二级缓存中,供下次按OID查找数据使用
缓存结构图(使用SQL查询数据)
二级缓存工作流程
l二级缓存开启后的数据操作
•使用SQL查询的数据(不做缓存数据存在性检测)
•执行SQL语句获取要查询的数据
•将查询的数据更新到一级缓存中
•将查询的数据更新到二级缓存中
•将查询的数据返回给客户端
缓存结构图(添加数据)
缓存结构图(删除修改数据)
二级缓存工作流程
l二级缓存开启后的数据操作
•添加数据
•更新所在一级缓存的数据
•更新数据库对应数据
•删除、修改数据
•更新所在一级缓存的数据
•更新所在二级缓存的数据
•更新数据库对应数据
获取二级缓存数据注意事项
l二级缓存的加入可以使用户减少与数据库间进行数据交互的次数,但是并不是所有操作的数据都可以从二级缓存中获取
•查询所有姓“李”的教师信息时,如果二级缓存中加载有一定量的数据,但是不确定是不是所有数据,此时数据获取如果从二级缓存中进行,将出现问题。
•二级缓存不是数据库的克隆版,不可能将整个数据库信息装入二级缓存,从设计上也是不允许的
•二级缓存对数据的识别采用OID的形式进行,只有仅按照OID的形式获取数据,才能从二级缓存中获取
•所有从数据库查询得到的数据都将加入二级缓存,为后期查询提高查询速度
二级缓存中的数据要求
l二级缓存的目的主要是为了提高查询速度,因此放入二级缓存的数据有严格的要求
•适合加入二级缓存的数据
•很少被修改的数据
•不是很重要的数据,允许出现偶尔并发的数据
•不会被并发访问的数据
•参考数据
•不适合加入二级缓存的数据
•经常被修改的数据
•财务数据,绝对不允许出现并发
•与其他应用共享的数据
二级缓存的使用
l二级缓存的出现有效的提高了信息查询的速度,但是并不是配置二级缓存后将所有数据放入二级缓存一定能加快速度,不合理的使用会降低整体应用的性能
l在实际开发过程中,前期一定要对数据进行合理的分析,有选择将数据放入二级缓存,而不能盲目的开启使用二级缓存
•教务系统——课程数据、教师数据、学生数据、成绩数据
•办公自动化系统——会议室使用记录、用车记录、工资数据
•淘宝网站——商品数据、用户数据、订单数据、地址数据
•政府网站——公示信息、办公流程数据、人员数据
Hibernate二级缓存配置方式
lHibernate配置二级缓存
•加入二级缓存供应商jar包
•为项目添加ehcache对应的jar包
•系统配置文件中开启二级缓存(hibernate.cfg.xml)
•系统配置文件中配置二级缓存供应商(hibernate.cfg.xml)
•添加二级缓存配置信息
•src目录下创建ehcache.xml文件
•具体配置信息参考ehcache对应的jar包中配置文件
l配置加入二级缓存的数据
•方式一:在映射文件hbm.xml文件中添加配置
•方式二:在系统配置文件cfg.xml文件中添加配置
•使用class-cache定义类对象缓存
•使用collection-cache定义集合对象缓存,注意这里定义的是关联关系中的集合对象名,而不是关联模型类,更不是集合
•usage定义了缓存的种类:读写缓存、只读缓存等
读取二级缓存数据
l二级缓存的数据必须先加载才可以使用,如果二级缓存中没有要查找的数据,在进行了对应的查找操作后,该数据立即进入二级缓存
l二级缓存的数据获取必须按照OID进行,因此查询方法中不是按照OID进行的查询将不能从二级缓存获取
•Query对应的操作
•Criteria对应的操作
•关于Query与Criteria对象执行查询时生成的SQL语句的识别
ehcache二级缓存配置详解
<diskStore path=“java.io.tmpdir”/>
<defaultCache
maxElementsInMemory="10"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"
maxElementsOnDisk="10000000"
diskPersistent="false"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU"
/>
ehcache自定义二级缓存配置详解
l在ehcache.xml中添加自定义缓存设定,指定不同的缓存策略
•<cache name=“my” 其他配置/>
针对不同的缓存内容,设定使用不同的cache策略
二级缓存数据存储区域
l二级缓存中的存储区域共分为4个
•类对象缓存区域
•关联关系集合对象缓存区域
•更新标识时间戳区域
•查询缓存区域
二级缓存——类对象缓存区
l类缓存区存储了类级别对象的缓存数据,包括以下四种数据
•普通类
•一对多、多对多关联关系中的主数据和从数据
•一对一关联关系中的主数据和从数据
•一对一关联中的主关联数据和从关联数据
l上述数据均是单一对象的格式
l二级缓存中存储的数据不是Java对象的格式,而是原始数据的散装数据,简言之就是将原始对象的数据分散存储,便于管理,获取时重新组装成对象
二级缓存——关联关系集合对象缓存区
l集合缓存区存储了类级别对象的缓存数据,包括以下四种数据
•一对多关联关系中的主关联数据
•多对一关联关系中的从关联数据
•多对多关联关系中的主关联数据和从关联数据
l上述数据均是集合对象的格式
l二级缓存中的集合数据仅保存对应对象在类对象缓存区保存数据的OID,集合中不存在任何OID之外的属性数据,因此集合数据如果没有设定对应的类对象缓冲区将失去缓存的意义
二级缓存——更新时间戳区与更新标识
l二级缓存中保存的数据与数据库对应,当客户端执行不使用一级缓存提供的更新操作时,此更新无法通知二级缓存进行数据同步,造成数据不同步
l为避免该问题,二级缓存始终监控被缓存数据对应的所有DML语言,如果发现对应数据进行了更新,无论是否进行了对应的真实数据更改,再次获取二级缓存中的数据时,强制重新加载数据,与数据库中的数据进行同步。
l实现方式:
•时间戳:为二级缓存数据追加加载时间与修改时间标识
•标志位:为二级缓存数据追加修改状态标识
二级缓存数据存储形式
二级缓存——查询缓存区
l二级缓存只能依赖仅使用OID进行查询,这一设定将对二级缓存的实用性大打折扣
l查询缓存可以有效解决上述问题
•查询缓存使用查询的最终SQL语句作为Key
•查询缓存使用查询的结果作为Value
二级缓存——查询缓存使用方式
l查询缓存使用步骤(基于二级缓存)
•设置开启查询缓存功能
•对要进行查询缓存的操作开始使用查询缓存设置
•setCacheable(true)操作表明本次查询设定缓存区域为查询缓存区域,而不是二级缓存的常规区域
l注意:查询缓存的数据只能从查询缓存中获取,与二级缓存中其他区域的数据没有关系,因此每次都要设定使用查询缓存
二级缓存数据存储区
作者:架构师小跟班
开发者导航: http://www.codernav.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
如果文中有什么错误,欢迎指出,以免更多的人被误导。