具体解释Hibernate中的二级缓存
1.前言
这篇博客再前几篇博客的基础上来解说一下。Hibernate中的二级缓存。二级缓存是属于SessionFactory级别的缓存机制。
第一级别的缓存是Session级别的缓存,是属于事务范围的缓存,由Hibernate管理,一般无需进行干预。第二级别的缓存是SessionFactory级别的缓存。是属于进程范围的缓存。
2.Hibernate二级缓存
1.分类
二级缓存也分为了两种
内置缓存:Hibernate自带的,不可卸载,通常在Hibernate的初始化阶段,Hibernate会把映射元数据和提前定义的SQL语句放置到SessionFactory的缓存中。该内置缓存是仅仅读的。
外置缓存:通常说的二级缓存也就是外置缓存,在默认情况下SessionFactory不会启用这个缓存插件,外置缓存中的数据是数据库数据的复制,外置缓存的物理介质能够是内存或者硬盘。
hibernate二级缓存的结构
2.并发訪问策略
transactional
(事务型)
仅在受管理的环境中适用
提供Repeatable Read事务隔离级别
适用常常被读。非常少改动的数据
能够防止脏读和不可反复读的并发问题
缓存支持事务,发生异常的时候。缓存也可以回滚
read-write
(读写型)
提供Read Committed事务隔离级别
在非集群的环境中适用
适用常常被读,非常少改动的数据
能够防止脏读
更新缓存的时候会锁定缓存中的数据
nonstrict-read-write
(非严格读写型)
适用极少被改动,偶尔同意脏读的数据(两个事务同一时候改动数据的情况非常少见)
不保证缓存和数据库中数据的一致性
为缓存数据设置非常短的过期时间,从而尽量避免脏读
不锁定缓存中的数据
read-only
(仅仅读型)
适用从来不会被改动的数据(如參考数据)
在此模式下,假设对数据进行更新操作,会有异常
事务隔离级别低,并发性能高
在集群环境中也能完美运作
分析:通过上述表格分析例如以下
适合放入二级缓存中数据
非常少被改动
不是非常重要的数据。同意出现偶尔的并发问题
不适合放入二级缓存中的数据
常常被改动
財务数据,绝对不同意出现并发问题
与其它应用数据共享的数据
3.二级缓存的配置
1.hibernate支持的缓存插件
•EHCache: 可作为进程范围内的缓存,存放数据的物理介质能够是内存或硬盘,对Hibernate的查询缓存提供了支持
•OpenSymphony`:可作为进程范围内的缓存,存放数据的物理介质能够是内存或硬盘,提供了丰富的缓存数据过期策略,对Hibernate的查询缓存提供了支持
•SwarmCache:可作为集群范围内的缓存,但不支持Hibernate的查询缓存
•JBossCache:可作为集群范围内的缓存,支持Hibernate的查询缓存
四种缓存插件支持的并发范围策略例如以下图
![]()
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
2.二级缓存配置
以下以ehcache缓存为例,来讲一下二级缓存的配置
2.1 拷贝jar包
如要第三方的jar包ehcache-1.5.0.jar,而且依赖于
依赖backport-util-concurrent 和 commons-logging
2.2 在hibernate.cfg.xml中开启二级缓存
<propertyname="hibernate.cache.use_second_level_cache">true</property>
2.3 配置二级缓存技术提供商
<propertyname="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
2.4 配置缓存数据对象并发策略
方式一 在hbm文件里配置
<span style="font-family:SimSun;font-size:18px;"><class name="cn.itcast.domain.Customer" table="customers" catalog="hibernate3day4" >
<!-- 类级别缓存 -->
<cache usage="read-write"/>
<set name="orders" cascade="all-delete-orphan" inverse="true" >
<!-- 关联集合级别缓存 -->
<cache usage="read-write"/>
</set>
</class>
</span>方式二 在cfg文件配置(集中配置)
<span style="font-family:SimSun;font-size:18px;"><!-- 类级别缓存 -->
<class-cache usage="read-write" class="cn.itcast.domain.Customer"/>
<class-cache usage="read-write" class="cn.itcast.domain.Order"/>
<!-- 集合缓存 -->
<collection-cache usage="read-write" collection="cn.itcast.domain.Customer.orders"/>
</span>2.5 加入二级缓存配置文件
在src中配置ehcache.xml,将ehcache.jar包中的ehcache-failsafe.xml 改名 ehcache.xml 放入 src
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd"> <diskStore path="java.io.tmpdir"/> 配置二级缓存硬盘暂时文件夹位置
<defaultCache
maxElementsInMemory="10000" // 内存中最大对象数量 ,超过数量。数据会被缓存到硬盘
eternal="false"
timeToIdleSeconds="120" // 是否缓存为永久性 false 不永久
timeToLiveSeconds="120" // 存活时间。对象无论是否使用,到了时间回收
overflowToDisk="true" // 能否够缓存到硬盘
maxElementsOnDisk="10000000" // 硬盘缓存最大对象数量
// 当jvm结束时是否持久化对象 true false 默认是false
diskExpiryThreadIntervalSeconds="120" // 指定专门用于清除过期对象的监听线程的轮询时间
memoryStoreEvictionPolicy="LRU" /> </ehcache>
4.Demo測试二级缓存
@Test
public void fun1() { Session s1 = HibernateUtils.getSession();
s1.beginTransaction();
Customer c1 = (Customer) s1.get(Customer.class, 1); // 从数据库中载入数据
System.out.println(c1.getName());//此时才会发出SQL语句
s1.getTransaction().commit();
s1.close(); // 关闭session级别的一级缓存 Session s2 = HibernateUtils.getSession();
s2.beginTransaction();
Customer c2 = (Customer) s2.get(Customer.class, 1); // 由于有了二级缓存的存在,直接从二级缓存中取出就可以
System.out.println(c2.getName()); Customer c3 = (Customer) s2.get(Customer.class, 1); //从二级缓存中取出
System.out.println(c3.getName()); s2.getTransaction().commit();
s2.close(); }
具体解释Hibernate中的二级缓存的更多相关文章
- Hibernate-ORM:16.Hibernate中的二级缓存Ehcache的配置
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 本篇博客讲述Hibernate中的二级缓存的配置,作者将使用的是ehcache缓存 一,目录 1.二级缓存的具 ...
- Hibernate中 一 二级缓存及查询缓存(1)
最近趁有空学习了一下Hibernate的缓存,其包括一级缓存,二级缓存和查询缓存(有些是参照网络资源的): 一.一级缓存 一级缓存的生命周期和session的生命周期一致,当前sessioin ...
- Hibernate中 一 二级缓存及查询缓存(2)
缓存:缓存是什么,解决什么问题? 位于速度相差较大的两种硬件/软件之间的,用于协调两者数据传输速度差异的结构,均可称之为缓存Cache.缓存目的:让数据更接近于应用程序,协调速度不匹配,使访问速度更 ...
- Hibernate中延迟加载和缓存
什么是延迟加载? 延迟加载是指当应用程序想要从数据库获取对象时(在没有设置lazy属性值为false),Hibernate只是从数据库获取符合条件的对象的OId从而生成代理对象,并没有加载出对象 访问 ...
- Hibernate中的一级缓存、二级缓存和懒加载(转)
1.为什么使用缓存 hibernate使用缓存减少对数据库的访问次数,从而提升hibernate的执行效率.hibernate中有两种类型的缓存:一级缓存和二级缓存. 2.一级缓存 Hibenate中 ...
- Hibernate中的一级缓存、二级缓存和懒加载
1.为什么使用缓存 hibernate使用缓存减少对数据库的访问次数,从而提升hibernate的执行效率.hibernate中有两种类型的缓存:一级缓存和二级缓存. 2.一级缓存 Hibenate中 ...
- Hibernate的一级二级缓存机制配置与测试
特别感谢http://www.cnblogs.com/xiaoluo501395377/p/3377604.html 在本篇随笔里将会分析一下hibernate的缓存机制,包括一级缓存(session ...
- hibernate 查询、二级缓存、连接池
hibernate 查询.二级缓存.连接池 查询: 1) 主键查询 Dept dept = (Dept) session.get(Dept.class, 12); Dept dept = (Dep ...
- 在Spring、Hibernate中使用Ehcache缓存(2)
这里将介绍在Hibernate中使用查询缓存.一级缓存.二级缓存,整合Spring在HibernateTemplate中使用查询缓存.,这里是hibernate3,使用hibernate4类似,不过不 ...
随机推荐
- 安卓操作sqlite3,增删改查
创建 layout <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:an ...
- BZOJ 1927 最小费用流问题
From lydrainbowcat //By SiriusRen #include <queue> #include <cstdio> #include <cstrin ...
- python中修改函数内部的变量会发生什么
最近写python遇到个函数内部变量使用外部变量的问题,现在总结下吧 #!/usr/bin/env python a = 100def su(): a = a + 1 print(a) s = su( ...
- JavaScript:理解prototype与__proto__,原型与原型链
JS中的继承是原型继承,通过原型实现的.为了理解原型,我想先讲讲对象的内部属性[[prototype]]和属性__proto__,函数的属性prototype. 对象的内部属性[[prototype] ...
- linux指令快速复制粘贴[龟速更新中]
由于有经常碰到要输入linux指令,但是却忘记了的情况.在家里我把常用的命令放到Xshell的快速命令集,但是在很多情况下不在家,可能用的他人电脑,以及在非Win环境下使用ssh时没有xshell使用 ...
- Spring学习总结(3)——Spring配置文件详解
Spring配置文件是用于指导Spring工厂进行Bean生产.依赖关系注入(装配)及Bean实例分发的"图纸".Java EE程序员必须学会并灵活应用这份"图纸&quo ...
- 绿色版SecureCRT启动崩溃,遇到一个致命的错误且必须关闭
百度搜了半天,大家都是说删除注册表的VanDyke就能解决问题,但是我用的是绿色版的,删除VanDyke后还不行. 然后试了一下重新解压出一个绿色版的SecureCRT,发现能用. 但之前我配置了很多 ...
- Spring Tool Suit安装virgo server插件、virgo的下载
virgo-tomcat原先是Spring DM Server,后来转eclipse社区维护 安装教程:http://osgi.com.cn/article/7289514 virgo-tomcat各 ...
- 分布式文件存储FastDFS(一)初识FastDFS
一.FastDFS简单介绍 FastDFS是一款开源的.分布式文件系统(Distributed File System),由淘宝开发平台部资深架构师余庆开发.作为一个分布式文件系统,它对文件进行管理. ...
- [2012山东省第三届ACM大学生程序设计竞赛]——Mine Number
Mine Number 题目:http://acm.sdut.edu.cn/sdutoj/problem.php? action=showproblem&problemid=2410 Time ...