您的位置:首页 > 其它

Hibernate 缓存

2015-07-08 00:00 148 查看
一级缓存是Session级别的缓存,Hiberante来管理的,这个一般不用管,

二级缓存是SessionFactory级别的,可以进行配置和更改,加载卸载

一级缓存的管理

当应用程序调用Session的save()、update()、savaeOrUpdate()、get()或load(),以及调用查询接口的list()、iterate() 方法时,如果在Session缓存中还不存在相应的对象,Hibernate就会把该对象加入到第一级缓存中。当清理缓存时,Hibernate会根据缓存中对象的状态变化来同步更新数据库。
Session为应用程序提供了两个管理缓存的方法:
evict(Object obj):从缓存中清除参数指定的持久化对象。
clear():清空缓存中所有持久化对象。

二级缓存的管理
Hibernate的二级缓存策略的一般过程如下:
1) 条件查询的时候,总是发出一条select * from table_name where …. (选择所有字段)这样的SQL语句查询数据库,一次获得所有的数据对象。
2) 把获得的所有数据对象根据ID放入到第二级缓存中。
3) 当Hibernate根据ID访问数据对象的时候,首先从Session一级缓存中查;查不到,如果配置了二级缓存,那么从二级缓存中查;查不到,再查询数据库,把结果按照ID放入到缓存。
4) 删除、更新、增加数据的时候,同时更新缓存。
什么样的数据适合存放到第二级缓存中?
1 很少被修改的数据
2 不是很重要的数据,允许出现偶尔并发的数据
3 不会被并发访问的数据
4 参考数据,指的是供应用参考的常量数据,它的实例数目有限,它的实例会被许多其他类的实例引用,实例极少或者从来不会被修改。
不适合存放到第二级缓存的数据?
1 经常被修改的数据
2 财务数据,绝对不允许出现并发
3 与其他应用共享的数据。

使用ehcache配置二级缓存

步骤:

1) 把ehcache-1.2.3.jar加入到当前应用的classpath中。
2) 在hibernate.cfg.xml文件中加入EhCache缓存插件的提供类。
<!—开启缓存-->

<property name="hibernate.cache.use_query_cache">true</property>

<!--配置缓存插件 -->

<property name="hibernate.cache.provider_class">

org.hibernate.cache.EhCacheProvider
</property>

3) 拷贝ehcache.xml文件到类路径(项目工程的src目录下),这个文件在Hibernate安装目录的etc下

在需要缓存的实体bean配置文件中加入缓存配置项

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-mapping PUBLIC

"-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package=“com.tfsoftware.hibernate.model.Dept">

<class name=“Dept" table=“dept">

<!— 配置缓存,必须紧跟在class元素后面, 对缓存中的Dept对象采用读写型的并发访问策略 -->

<cache usage="read-write" region="com.tfsoftware.hibernate.model.Dept "/>

<id column="deptID" name="deptID" type="integer">

<generator />
</id>
<property column="deptName" length="50" name="deptName"

not-null="true" type="string" />

<set name="employees" cascade="save-update" inverse="true">

<!-- Hibernate只会缓存对象的简单属性的值,

要缓存集合属性,必须在集合元素中也加入<cache>子元素

而Hibernate仅仅是把与当前持久对象关联的对象的OID存放到缓存中。

如果希望把整个关联的对象的所有数据都存入缓存,

则要在相应关联的对象的映射文件中配置<cache>元素 -->

<cache usage="read-write"/>

<key>

<column name="deptID" not-null="true"/>

</key>

<one-to-many

class="com.tfsoftware.hibernate.model.Employee" />

</set>

</class>

</hibernate-mapping>

说明:usage说明了缓存的策略,region指定缓存的区域名

Ehcache默认的配置文件ehcache.xml(放在类路径下)

<ehcache>

<diskStore path="D:\cache"/>

<defaultCache maxElementsInMemory="1000“ eternal="false“ overflowToDisk="true"

timeToIdleSeconds="120"

timeToLiveSeconds="180"

diskPersistent="false"

diskExpiryThreadIntervalSeconds="60"/>

<!-- 设置Dept类的employee集合的缓存的数据过期策略 -->

<cache name=" com.tfsoftware.hibernate.model.Dept.employees"

maxElementsInMemory="100"
eternal="false"

overflowToDisk="true"

timeToIdleSeconds="300"

timeToLiveSeconds="600"

diskPersistent="false"/>

</ehcache>

Ehcache默认的配置文件ehcache.xml

说明:

defaultCache节点为缺省的缓存策略

maxElementsInMemory 内存中最大允许存在的对象数量

eternal 设置缓存中的对象是否永远不过期

overflowToDisk 把溢出的对象存放到硬盘上

timeToIdleSeconds 指定缓存对象空闲多长时间就过期,过期的对象会被清除掉

timeToLiveSeconds 指定缓存对象总的存活时间

diskPersistent 当jvm结束是否持久化对象

diskExpiryThreadIntervalSeconds 指定专门用于清除过期对象的监听线程的轮询时间

二级缓存:

1>准备工作:
(1)需要copy commons-logging-1.0.4 jar包到lib目录中

2>在cfg文件中配置:
<!—开启缓存-->

<property name="hibernate.cache.use_query_cache">true</property>

<!--配置缓存插件 -->

<property name="hibernate.cache.provider_class">
org.hibernate.cache.EhCacheProvider

</property>
3>需要在hbm文件中配置:(谁需要放入二级缓存就在谁的映射中写以下配置,如果是主从表关系那么主表中的set想要有从表数据的话必须在从表映射中也要加以下配置)
<!— 配置缓存,必须紧跟在class元素后面,?对缓存中的Dept对象采用读写型的并发访问策略?-->

<cache usage="read-write" region="com.tfsoftware.hibernate.model.Dept "/>
4>需要把E:\course\jsp\Hibernate\hibernate-distribution-3.3.2.GA\project\etc目录下的ehcache.xml文件copy到src目录里
<ehcache>
<diskStore path="D:\cache"/>
<defaultCache
maxElementsInMemory="1000“ eternal="false“ overflowToDisk="true"
timeToIdleSeconds="120"

timeToLiveSeconds="180"

diskPersistent="false"

diskExpiryThreadIntervalSeconds="60"/>
<!-- 设置Dept类的employee集合的缓存的数据过期策略 -->

<cache name=" com.tfsoftware.hibernate.model.Dept.employees" maxElementsInMemory="100"

eternal="false"
overflowToDisk="true"

timeToIdleSeconds="300"

timeToLiveSeconds="600"

diskPersistent="false"/>

</ehcache>
defaultCache节点为缺省的缓存策略

maxElementsInMemory 内存中最大允许存在的对象数量

eternal 设置缓存中的对象是否永远不过期

overflowToDisk 把溢出的对象存放到硬盘上

timeToIdleSeconds 指定缓存对象空闲多长时间就过期,过期的对象会被清除掉

timeToLiveSeconds 指定缓存对象总的存活时间

diskPersistent 当jvm结束是否持久化对象

diskExpiryThreadIntervalSeconds 指定专门用于清除过期对象的监听线程的轮询时间
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: