Hibernate-cache缓存-5
来源:互联网 发布:计算机二级c语言知识点 编辑:程序博客网 时间:2024/06/06 00:19
缓存可以简单的看成一个 Map ,通过 key 在缓存里面找 value 。
一、缓存简介 Cache In Hibernate
HIBERNATE 中的 CACHE 有两级 .
一级是在 Session 范围内的 CACHE . 即每个 Session 有自己的一个 CACHE, 当前操作的对象都会被保留在 CACHE 中 . 但是 Session 关闭后这个CACHE 也就没有 . 可见这级 CACHE 的生命期是很短的 . (使用 id 进行关键字存储:缓存的 key 就是 ID , value 是 POJO ) ( 缓存的是实体对象 )
另一级 CACHE 是在 SessionFactory 范围的 , 可以被来自同一个 SessionFactory 的 Session 共享 . 在 HIBERNATE 的文档中称其为 SECOND LEVEL CACHE. 显然后者的优势较明显 , 也比较复合当前的使用环境 . 它可以使用不同的缓存实现,如 EhCache 、 JBossCache 、 OsCache 等 (二级缓存是缓存实体对象的)
还有一个类型的 CACHE 就是 QueryCache . 它的作用就是缓存一个 Query 以及 Query 返回对象的 Identifier 以及对象的类型 . 有了 QueryCache 后就可以高效的使用 SECOND LEVEL CACHE.
hibernate 查询缓存 (hibernate 默认是关闭的 )
查询缓存是针对普通属性结果集的缓存
对实体对象的结果集只缓存 id
查询缓存的生命周期,当前关联的表发生修改,那么查询缓存生命周期结束
查询缓存的配置和使用:
1. 启用查询缓存:在 hibernate .cfg.xml 中加入:
<
property
name=”hibernate.cache.use_query_cache”>true</
property
>
2. 在程序中必须手动启用查询缓存,如: query.setCacheable(true);
QueryCache 用来缓存查询语句 , 及查询结果集中对象的 Identifier 与 Type. 当再次使用已缓存的 Query 时 , 就可以通过对象的 Identifier 与 Type 在SECOND LEVEL CACHE 中查找实际的对象 .
对于查询缓存来说,缓存的 key 是根据 hql 生成的 sql ,再加上参数,分页等信息(可以通过日志输出看到,不过它的输出不是很可读,最好改一下它的代码)。
注:一级缓存也叫 session 级的缓存或事务缓存。 Hibernate 二级缓存也称为进程级的缓存或 SessionFactory 级的缓存。二级缓存是全局缓存,它可以被所有的 session 共享。二级缓存的生命周期和 SessionFactory 的生命周期一致, SessionFactory 可以管理二级缓存。
二、缓存的范围
缓存的范围分为 3 类 :
1. 事务范围
事务范围的缓存只能被当前事务访问 , 每个事务都有各自的缓存 , 缓存内的数据通常采用相互关联的对象形式 . 缓存的生命周期依赖于事务的生命周期, 只有当事务结束时 , 缓存的生命周期才会结束 . 事务范围的缓存使用内存作为存储介质 , 一级缓存就属于事务范围 .
2. 应用范围
应用程序的缓存可以被应用范围内的所有事务共享访问 . 缓存的生命周期依赖于应用的生命周期 , 只有当应用结束时 , 缓存的生命周期才会结束 . 应用范围的缓存可以使用内存或硬盘作为存储介质 , 二级缓存就属于应用范围 .
3. 集群范围
在集群环境中 , 缓存被一个机器或多个机器的进程共享 , 缓存中的数据被复制到集群环境中的每个进程节点 , 进程间通过远程通信来保证缓存中的数据的一致 , 缓存中的数据通常采用对象的松散数据形式 .
三、缓存的方式
有四种,分别为:
CacheConcurrencyStrategy.NONE
CacheConcurrencyStrategy.READ_ONLY ,只读模式,在此模式下,如果对数据进行更新操作,会有异常;
CacheConcurrencyStrategy.READ_WRITE ,读写模式在更新缓存的时候会把缓存里面的数据换成一个锁,其它事务如果去取相应的缓存数据,发现被锁了,直接就去数据库查询;
CacheConcurrencyStrategy.NONSTRICT_READ_WRITE ,不严格的读写模式则不会的缓存数据加锁;
CacheConcurrencyStrategy.TRANSACTIONAL ,事务模式指缓存支持事务,当事务回滚时,缓存也能回滚,只支持 JTA 环境。
缓存的注释写法如下,加在 Entity 的 java 类上:
@Cache
(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
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的配置文件中设置如下:
org.hibernate.cache.EhCacheProvider
</property>
<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缓存-5
- hibernate Cache缓存
- Hibernate缓存机制----二级Cache
- Hibernate缓存问题(Problem with Hibernate Cache)
- hibernate二级缓存:Hibernate缓存Cache配置
- 详解hibernate的cache缓存问题
- Hibernate Session level Cache (一级缓存)
- Hibernate的Entity cache(实体缓存)
- Hibernate中的Collection cache(集合缓存)
- Hibernate中的Query cache(查询缓存)
- hibernate4缓存org.hibernate.cache.NoCacheRegionFactoryAvailableException
- 缓存简介--Cache In Hibernate: @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
- 缓存简介--Cache In Hibernate: @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
- 缓存简介--Cache In Hibernate: @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
- 缓存简介--Cache In Hibernate: @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
- hibernate缓存:Hibernate获取数据方式和缓存Cache使用
- 缓存cache
- 缓存 Cache
- hdoj 1239 Calling Extraterrestrial Intelligence Again(数学)
- js中substring和substr的用法
- Android变量保存的总结
- ListView在removeFooterView时报java.lang.ClassCastException错问题
- linux下静态库、动态库总结
- Hibernate-cache缓存-5
- 面试答疑
- android中使用DisplayMetrics获取屏幕参数
- HDU 1520
- Fragment和Activity
- C Tips: std::string / std::wstring 的 Trim 函数
- 在switch-case中定义变量时当心被“穿越”
- shell tr
- ASI的配置方式