攻城狮在路上(壹) Hibernate(十八)--- 管理Hibernate的缓存
一般Session的缓存被称为Hibernate的第一级缓存,SessionFactory的外置缓存是一个可配置的缓存插件,称为Hibernate的第二级缓存。
一、缓存的基本原理:
1、持久化层的缓存的范围:
A、事务范围:缓存只被当前事务访问。
B、进程范围:缓存被进程内的所有事务共享。需要采取必要的隔离机制。缓存介质可以使内存或硬盘。
C、集群范围:缓存被同一个机器或多个机器上的多个进程共享。缓存中的数据被复制到集群环境中的每一个进程节点,进程之间通过远程通信来保证缓存中的数据一致性,缓存中的数据通常采用数据的散装数据形式。
事务范围的缓存是持久化层的第一级缓存,通常是必需的;进程范围和集群范围的缓存是持久化层的第二级缓存,通常是可选的。
2、持久化层的缓冲的并发访问策略:
第二级缓存可能会出现并发问题,因此提供了4种类型的并发访问策略。
A、事务型(Transactional):仅在受管理环境中适用。
B、读写型(Read-write):提供Read Committed事务隔离级别,仅在非集群的环境中使用。
C、非严格读写型(Nonstrict-read-write):不保证缓存和数据库中数据的一致性。
D、只读型(Read-only):对于从来不会修改的数据,可以采用此种方式。
3、适合存放到第二级缓存中的数据:
A、很少被修改的数据。
B、不是很重要的数据,允许出现偶尔的并发问题。
C、不会被并发访问的数据。
D、参考数据。
二、Hibernate的二级缓存结构:

三、管理Hibernate的第一级缓存:
Session.evict(Ojbect o):从缓存中清除参数指定的持久化对象。
Session.clear():清空缓存中所有的持久化对象。
多数情况下,不提倡使用。
四、管理Hibernate的第二级缓存:
Hibernate的第二级缓存时进程或集群范围内的缓存,缓存中存放的是对象的散装数据。第二级缓存是可配置的插件。
1、Hibernate允许使用的缓存插件:
A、EHCache:可作为进程范围的缓存,存放数据的物理介质可以使内存或者硬盘,支持Hibernate的查询缓存。
B、OpenSymphony OSCache:可作为进程范围的缓存,存放介质可以使内存或硬盘,支持Hibernate的查询缓存,提供了丰富的缓存数据过期策略。
C、SwarmCache:可作为集群范围内的缓存,但是不支持Hibernate的查询缓存。
D、JBossCache:可作为集群范围内的缓存,支持事务型并发访问策略,支持Hibernate的查询缓存。
各个缓存插件支持的并发访问策略:
| 缓存插件 | 只读型 | 非严格读写型 | 读写型 | 事务型 |
| EHCache | 支持 | 支持 | 支持 | 否 |
| OSCache | 支持 | 支持 | 支持 | 否 |
| SwarmCache | 支持 | 支持 | 否 | 否 |
| JBossCache | 支持 | 否 | 否 | 支持 |
为了集成上述缓存插件,Hibernate提供了一个CacheProvider接口,每种缓存插件对应有一个实现类。
2、配置第二级缓存主要包含以下步骤:
A、选择需要使用第二级缓存的持久化类,设置它的第二级缓存的并发访问策略。既可以在映射文件中配置,也可以再hibernate.cfg.xml中配置。
B、选择合适的缓存插件,每一种缓存插件都有自带的配置文件,需要手工编辑。例如EhCache的配置文件为ehcache.xml。
3、配置进程范围的第二级缓存:
Hibernate允许在类和集合的粒度上设置第二级缓存,映射文件中<class>和<set>元素都有一个<cache>子元素,用于配置第二级缓存。
<cache
usage="transactionql|read-write|nonstrict-read-write|read-only"
region="RegionName"
include="all|non-lazy"
/>
实例代码:
Customer.xml:
<hibernate-mapping > <class name="mypack.Customer" table="CUSTOMERS" >
<cache usage="read-write" />
<id name="id" type="long" column="ID">
<generator class="increment"/>
</id> <property name="name" type="string" >
<column name="NAME" length="15" />
</property> <property name="age" type="int" >
<column name="AGE" />
</property> <set
name="orders"
inverse="true"
lazy="true"
>
<cache usage="read-write" />
<key column="CUSTOMER_ID" />
<one-to-many class="mypack.Order" />
</set> </class> </hibernate-mapping>
ehcache.xml:
<ehcache> <diskStore path="C:\\temp"/> <defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"
/> <cache name="mypack.Customer"
maxElementsInMemory="1"
eternal="false"
timeToIdleSeconds="300"
timeToLiveSeconds="600"
overflowToDisk="true"
/> <cache name="mypack.Customer.orders"
maxElementsInMemory="1000"
eternal="true"
overflowToDisk="false"
/> <cache name="mypack.Order"
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="300"
timeToLiveSeconds="600"
overflowToDisk="true"
/> <cache name="customerQueries"
maxElementsInMemory="1000"
eternal="false"
timeToIdleSeconds="300"
timeToLiveSeconds="600"
overflowToDisk="true"
/> </ehcache>
hibernate.properties:
hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider
hibernate.cache.use_query_cache=true
4、配置集群范围的第二级缓存:
暂不了解。
攻城狮在路上(壹) Hibernate(十八)--- 管理Hibernate的缓存的更多相关文章
- 攻城狮在路上(壹) Hibernate(十六)--- Hibernate声明数据库事务
一.数据库事务的概念: 数据库的ACID特征:Atomic.Consistency.Isolation.Durability.原子性.一致性.隔离性.持久性.不同的隔离级别引发的不同问题. 事务的AC ...
- 攻城狮在路上(壹) Hibernate(十五)--- Hibernate的高级配置
一.配置数据库连接池: 1.使用默认的数据库连接池: Hibernate提供了默认了数据库连接池,它的实现类为DriverManegerConnectionProvider,如果在Hibernate的 ...
- 攻城狮在路上(壹) Hibernate(二)--- 第一个hibernate程序
1.直接通过JDBC API持久化实体域对象: A.java.sql常用接口和类: DriverManager:驱动程序管理器,负责创建数据库连接. Connection:代表数据库连接. State ...
- 攻城狮在路上(壹) Hibernate(十四)--- Hibernate的检索方式(下)
本节介绍HQL和QBC的高级用法:各种连接查询.投影查询.报表查询.动态查询.集合过滤和子查询等.另外将归纳优化查询程序代码,从而提高查询性能的各种技巧.一.连接查询: HQL与QBC支持的各种连接类 ...
- 攻城狮在路上(壹) Hibernate(十二)--- Hibernate的检索策略
本文依旧以Customer类和Order类进行说明.一.引言: Hibernate检索Customer对象时立即检索与之关联的Order对象,这种检索策略为立即检索策略.立即检索策略存在两大不足: A ...
- 攻城狮在路上(壹) Hibernate(十)--- 映射值类型集合
一.映射Set(集):未排序,无重复. 实例代码: <set name="images" table="IMAGES" lazy="true&q ...
- 攻城狮在路上(壹) Hibernate(十三)--- Hibernate的检索方式(上)
Hibernate提供了以下几种检索对象的方式: A.导航对象图检索方式. B.OID检索方式.Session.get() load(); C.HQL检索方式.Query. D.QBC检索方式.Que ...
- 攻城狮在路上(壹) Hibernate(十七)--- Hibernate并发处理问题
一.多个事务并发运行时的并发问题: 总结为第一类丢失更新.脏读.虚读.不可重复读.第二类丢失更新. 1.第一类丢失更新: 撤销一个事务时,把其他事务已提交的更新数据覆盖. 2.脏读: 一个事务读到另一 ...
- 攻城狮在路上(壹) Hibernate(九)--- Hibernate的映射类型
Hibernate采用映射类型作为Java类型和SQL类型的桥梁,对应type属性.分为两种:内置映射类型和客户化映射类型.一.内置映射类型: 1.Java基本类型的Hibernate映射类型: Ja ...
随机推荐
- java78_c
import java.util.*; public class Main { public static void main(String args[]){ Scanner cin=new Scan ...
- OLA音频变速算法的仿真与剖析
前段时间,在尝试音乐节拍数的提取时,终于有了突破性的进展,效果基本上比市面上的许多商业软件还要好,在作节拍数检测时,高频信息作用不大, 通过重采样减小运算量.重采样让我想起了在学校里面做的变速变调算法 ...
- SqlServer中的Null值空值问题
sql使用的是三值谓词逻辑,所以逻辑表达式返回的结果可以为True.False或者未知,在三值逻辑中返回True与不返回False并不完全一样, SQL对查询过滤条件的处理:接受TURE 拒绝FAL ...
- How do I get ASP.NET Web API to return JSON instead of XML using Chrome
public static class WebApiConfig { public static void Register(HttpConfiguration config) { config.Ro ...
- unity3d项目文件目录发布后,对应的ios/android应用目录[转]
Unity3d的Resource.AssetBundle与手游动态更新的报告,在这里分享一下,希望能够对各位用Unity的朋友有些许帮助.目录:1.Unity的资源数据加载2.Resource.Str ...
- Semaphore(信号量)
Semaphore msdn介绍: 限制可同时访问某一资源或资源池的线程数. 命名空间: System.Threading 程序集: System(在 System.dll 中) 通俗理解: 1:宾馆 ...
- selenium webdriver学习(一)
package baidu; import java.io.File; import java.io.IOException; import junit.framework.TestCase; imp ...
- ACM/ICPC 之 BFS-广搜+队列入门-抓牛(POJ3278)
这一题是练习广度优先搜索很好的例题,在很多广搜教学中经常用到,放在这里供学习搜索算法的孩纸们看看= = 题目大意:一维数轴上,农夫在N点,牛在K点,假定牛不会移动,农夫要找到这头牛只能够进行以下三种移 ...
- 【STL】 set集合容器常用用法
set集合容器:实现了红黑树的平衡二叉检索树的数据结构,插入元素时,它会自动调整二叉树的排列,把元素放到适当的位置,以保证每个子树根节点键值大于左子树所有节点的键值,小于右子树所有节点的键值:另外,还 ...
- 解决 spring mvc 3.0 结合 hibernate3.2 使用<tx:annotation-driven>声明式事务无法提交的问题(转载)
1.问题复现 spring 3.0 + hibernate 3.2 spring mvc使用注解方式:service使用@service注解 事务使用@Transactional 事务配置使用 < ...