hibernate cache那些事
来源:互联网 发布:nba球队数据排名 编辑:程序博客网 时间:2024/06/10 17:28
Hibernate实现了良好的Cache机制,可以借助Hibernate内部的Cache迅速提高系统的数据读取性能。Hibernate中的Cache可分为两层:一级Cache和二级Cache。
一级Cache:
Session实现了第一级Cache,它属于事务级数据缓冲。一旦事务结束,这个Cache也随之失效。一个Session的生命周期对应一个数据库事务或一个程序事务。
Session-cache保证了一个Session中两次请求同一个对象时,取得的对象是同一个JAVA实例,有时它可以避免不必要的数据冲突。另外,它还能为另一些重要的性能提供保证:
1:在对一个对象进行自我循环引用时, 不至于产生堆栈溢出。
2:当数据库事务结束时,对于同一个数据库行,不会产生数据冲突,因为对于数据库中的一行,最多只有一个对象来表示它。
3:一个事务中可能会有很多个处理单元,在每一个处理单元中做的操作都会立即被另外的处理单元得知。
我们不用刻意去打开Session-cache,它总是被打开并且不能被关闭。当使用save(),update()或saveOrUpdate()来保存数据更改,或通过load(),find(),list()等方法来得到对象时,对象就会被加入到Session-cache。
如果要同步很多数据对象,就需要有效地管理Cache,可以用Session的evict()方法从一级Cache中移除对象。如下:
Transaction tx = session.beginTransaction();
for(int i = 0 ; i <100000 ; i++)
{
Student stu = new Student();
session.save(stu);
}
tx.commit();
session.close();
然后我们在程序中一定时刻就提交并更新Session的Cache:
Transaction tx = session.beginTransaction();
for(int i = 0 ; i <100000 ; i++)
{
Student stu = new Student();
session.save(stu);
if(i%20 == 0) //每保存完20个对象后,进行如下操作
{
session.flush();//这个会提交更新
session.clear();//清除Cache,释放内存
}
}
tx.commit();
session.close();
二级Cache
二级Cache是SessionFactory范围内的缓存,所有的Session共享同一个二级Cache。在二级Cache中保存持久性实例的散装形式的数据。二级Cache的内部如何实现并不重要,重要的是采用哪种正确的缓存策略,以及采用哪个Cache提供器。持久化不同的数据需要不同的Cache策略,比如一些因素将影响到Cache策略的选择:数据的读/写比例,数据表是否能被其他的应用程序扬访问等。对于一些读/写比例高的数据可以打开它的缓存,允许这些数据进入二级缓存容器有利于系统性能的优化;而对于能被其它应用程序访问的数据对象,最好将此对象的二级Cache选项关闭。
设置Hibernate的二级Cache需要分两步进行:首先确认使用什么数据并发策略,然后配置缓存过期时间并设置Cache提供器。
有4种内置的Hibernate数据并发冲突策略,代表数据库隔离级别,如下:
1:事务(Transaction)仅在受管理的环境中可用。它保证可重读的事务隔离级别,可以对读/写比例高,很少更新的数据采用该策略。
2:读写(read-write)使用时间戳机制维护读写提交事务隔离级别。可以对读/写比例高,很少更新的数据采用该策略。
3:非严格读写(notstrict-read-write)不保证Cache和数据库之间的数据库的一致性。使用此策略时,应该设置足够的缓存过期时间,否则可能从缓存中读出脏数据。当一些数据极少改变,并且当这些数据和数据库有一部份不量影响不大时,可以使用此策略。
4:只读(read-only)当确保数据永不改变时,可以使用此策略。
我们确定了Cache策略后,就要挑选一个高效的Cache提供器,它将作为插件被Hibernate调用。Hibernate允许使用下述几种缓存插件:
EhCache:可以在JVM中作为一个简单进程范围内的缓存,它可以把缓存的数据放入内存或磁盘,并支持Hibernate中可选用的查询缓存。
OpenSymphony OSCache:和EhCache相似,并且提供了丰富的缓存过期策略。
SwarmCache:可作为集群范围的缓存,但不支持查询缓存。
JBossCache:可作为集群范围的缓冲,但不支持查询缓存。
在Hibernate中使用EhCache
EhCache是一个纯JAVA程序,可以在Hibernate中作为一个插件引入。在Hibernate中使用EhCache需要在Hibernate的配置文件中设置如下:
(hibernate 3.x适用)
org.hibernate.cache.EhCacheProvider
</property>
但是对于hibernate v4或者v5.x,其格式变成为:
(hibernate 4.x or v5.0 适用)
<property name="hibernate.cache.region.factory_class">
org.hibernate.cache.ehcache.EhCacheRegionFactory
</property>
EhCacheProvider类是位于Hibernate3/4/5.jar包中而不是ehcache-1.1.jar包中。EhCache有自己的配置文档,名为chcache.xml。Hibernate3/4/5.x中的etc目录下有ehcache.xml的示例文件,只须要将 它COPY到我们的应用程序src目录下(编译时会把ehcache.xmlCOPY到WEB-INF/classes目录下)。对其中的相关值进行更改以和自己的程序相适应。进行配置后,在ehcache.xml文件中的代码如下:
<diskStore path="c:\\cache"/> //设置cache.data文件存放位置
<defaultCache
maxElementsInMemory="10000" //缓存中允许创建的最大对象数
eternal="false" //缓存中对象是否为永久的
timeToIdleSeconds="120"//缓存数据钝化时间(即对象在它过期前的空闲时间)
timeToLiveSeconds="120"//缓存数据生存时间(即对象在它过期前的生存时间)
overflowToDisk="true"
/>
<cache name="Student" //用户自定义的Cache配置
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="300"
timeToLiveSeconds="600"
overflowToDisk="true"
/>
</ehcache>
在Group.hbm.xml中如下
在其<set></set>中添加
<cache usage="read-write" /><!--cache标记需跟在class标记后-->
</class>
- hibernate cache那些事
- 说说cache那些最基本的事
- hibernate cache
- hibernate cache
- Hibernate cache
- Hibernate Cache
- 【Hibernate】hibernate的cache
- 关于CPU Cache -- 程序员需要知道的那些事
- 关于CPU Cache -- 程序猿需要知道的那些事
- 关于CPU Cache -- 程序猿需要知道的那些事
- 关于CPU Cache -- 程序猿需要知道的那些事
- Hibernate的那些事-manyToOne映射
- hibernate那些蛋蛋疼的事。
- hibernate学习之SessionFactory的那些事
- hibernate学习之HQL那些事
- 使用hibernate进行数据校验那些事
- 关于Hibernate Cache
- hibernate cache introduction
- Exception
- 1068. Find More Coins (30)
- Redis安装
- 形态学图像处理
- 解决Activity启动黑屏及设置android:windowIsTranslucent不兼容activity切换动画问题
- hibernate cache那些事
- 基数排序应用
- Android--自定义视图控件(一)(Android Studio)
- JavaWEB 核心编程视频教程 01
- Hadoop的JobControl设计及用法
- 为什么 Instantiate 克隆出来的GameObject的Scale 在 SetParent 总是放大 64倍?
- linux学习之c语言变量所占字节数
- 字符串加密,解密,利用 sun.misc.BASE64Decode类的 encode(byte)编码和decodeBuffer(str)解码
- 程序员面试准备